b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

线程安全问题代码 在ConcurrentModificationException异常上的联想

电脑杂谈  发布时间:2018-02-17 07:07:49  来源:网络整理

线程安全问题代码_什么是线程安全_什么叫线程安全

1.什么是ConcurrentModificationException?

大家都听说过快速报错fast-fail吧,fast-fail的发生就是说明发生了ConcurrentModificationException异常。其实发生这种异常的事件有两种,一种是在Iterator在迭代过程中,出现删除或者增加Collection中的元素的时候。线程安全问题代码另一种是多线程情况下,一个线程在用Iterator迭代Collection元素时,另一个线程却在给这个Collection增加或者删除元素。大家也许看出来了,两种情况其实都是在Iterator迭代元素过程中增加或者删除元素。

2.制造ConcurrentModificationException?

运行结果:

确实是发生错误了,点击错误信息,调到了下面的代码:

大概意思是Collection中的元素与开始遍历的时候传来的个数不相同。

那到底是什么调用了上面的方法?

那我们在next()方法后面,仿照CAS机制中的ABA问题,先添加元素然后删除元素,行不行呢?(这样做毫无意义)

答案是不行的:

因为remove中也调用了上面的那个方法。但是我们可以用一种方法,在遍历的过程中把需要删除的对象保存到一个集合中,等遍历结束后再调用removeAll()方法来删除,或者使用iterator.remove()方法。

3.为什么我们需要ConcurrentHashMap和CopyOnWriteArrayList?

线程安全问题代码_什么叫线程安全_什么是线程安全

同步的集合类(Hashtable和Vector),同步的封装类(使用Collections.synchronizedMap()方法和Collections.synchronizedList()方法返回的对象)可以创建出线程安全的Map和List。线程安全问题代码但是有些因素使得它们不适合高并发的系统。它们仅有单个锁,对整个集合加锁,以及为了防止ConcurrentModificationException异常经常要在迭代的时候要将集合锁定一段时间,这些特性对可扩展性来说都是障碍。

4.为什么用CopyOnWriteArrayList代替ArrayList,就不会产生ConcurrentModificationException?

从字面意思上可以看出来复制出来一份来操作,然后写道原先的ArrayList中。这样说肯定不行,我们看看源码,验证字面意思对不对?

既然在迭代的时候能add,我们先看看add的实现:

那还有一个问题,在调用Iterator的next方法,结果会是什么样的呢?边add边迭代吗?

运行结果:

看看原因:

并发场景下对容器的添加操作是通过在容器内部数据数组的副本来完成的。对容器的迭代使用的是容器原始数据数组因为迭代不会产生修改,因此多个线程可以同时对容器进行迭代,而不会对彼此干扰或影响修改容器的线程。

5.为什么用ConcurrentHashMap代替hashMap,就不会产生ConcurrentModificationException?

运行结果:

看看原因:

线程安全问题代码_什么是线程安全_什么叫线程安全

还是期望值与传进来的元素数量不相等所导致的。

解决办法:

6.hashtable怎么就不能代替在多线程情况下的hashMap?

Hashtable和ConcurrentHashMap都可以用于多线程的环境,但是当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。因为ConcurrentHashMap引入了分割(segmentation),不论它变得多么大,仅仅需要锁定map的某个部分,而其它的线程不需要等到迭代完成才能访问map。简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable则会锁定整个map。也就是说代替是可以代替,但是在解决线程安全的同时降低了性能,所以选用ConcurrentHashMap。

7.为什么要在多线程下使用hashMap呢?

这是废话。线程不安全你还偏要用,非得跟自己吗?

参考资料:

CocurrentHashMap和Hashtable的区别

Iterator

JCIP_5_01_CopyOnWriteArrayList为什么不会产生ConcurrentModificationException

老生常谈,HashMap的死循环

理解和解决Java并发修改异常ConcurrentModificationException


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-81651-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...