快速失败(fail-fast)以及其中的问题与安全失败(fail-safe)

本文探讨了Java中的快速失败(fail-fast)和安全失败(fail-safe)机制。在单线程环境中,使用迭代器遍历集合时,如果集合结构改变,fail-fast会抛出并发修改异常。而在多线程环境下,对集合并发修改可能导致fail-fast或fail-safe行为。文章通过实例分析了为何在某些情况下fail-fast不会抛出异常,并介绍了CopyOnWriteArrayList等安全失败的集合类,它们通过复制集合来避免异常,但可能不反映最新的集合状态。
摘要由CSDN通过智能技术生成

问题缘由

在写强化耗材功能时,需要判断一个逻辑:如果消耗了材料导致背包中的该材料数量为0了,需要在背包中移除该材料。

在移除操作时,直接遍历了该HashMap集合移除了集合中的指定元素,一旦判定到材料数为0时,就会抛出异常。

/* 错误写法:一旦判定到材料数为0时,就会抛出异常。 */
for(IItem iItem:iItemMap.values()){
   
	if(improveToxml:getItemId() == iItem.getItemId()){
   
		if(iItem.getAmount() >= improveToxml.getAmount()){
   
			iItem.setAmount(iItem.getAmount() - improveToxml.getAmount());
			if(iItem.getAmount() == 0){
   
			iItemMap.remove(iItem.getItemId());
			}
		}
		else{
   break;}
    }
}

经了解,发现原因是Java的快速失败(fail-fast)机制,于是更改了代码写法,使用Iterator对象的remove()方法。

/* 修改写法:使用Iterator对象的remove()方法。 */
Iterator<iItem> it = iItemMap.values().iterator();
while(it.hadNext()){
   
	IItem iItem = it.next;
	if(iItem.getAmount() >= improveToxml.getAmount()){
   
			iItem.setAmount(iItem.getAmount() - improveToxml.getAmount());
			if(iItem.getAmount
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值