本文主要是介绍使用Collections.synchronizedList对List的add方法加锁,使其add的时候线程安全,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
普通list
是线程不安全的
List list = new ArrayList<>();
在多线程的情况下,向list插入数据的时候,可能会造成数据丢失的情况.并且一个线程在遍历List,另一个线程修改List,会报ConcurrentModificationException(并发修改异常)错误.
原因入下图,多个线程进入add
方法的时候,此时如果计算后不需要扩容,那么第一个元素是可以add
进去的,但是之后的几个元素add
的时候就会下标越界了,从而抛异常
用Collections.synchronizedList
实例化的list
则在add
的时候是线程安全的
List list = Collections.synchronizedList(new ArrayList<>())
可以看到在add
的时候加了synchronized
对象锁,这样在add的时候就会依次进入这个方法
文档中还提示了,在迭代的时候最好也加上对象锁,因为上面的list
在整个迭代的过程中如果在循环外面不加同步代码,在一次次迭代之间,其他线程对于这个容器的add
或者remove
会影响整个迭代的预期效果,所以这里需要用户在整个循环外面加上synchronized(list)
对象锁;
这篇关于使用Collections.synchronizedList对List的add方法加锁,使其add的时候线程安全的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!