ArrayList线程不安全

https://blog.csdn.net/zlfing/article/details/109738440?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170726873416800227478108%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170726873416800227478108&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-109738440-null-null.142^v99^pc_search_result_base9&utm_term=copyonwritearraylist&spm=1018.2226.3001.4187

 

多线程下用ArrayList做add操作会出问题。

Exception in thread "pool-8-thread-21" java.lang.ArrayIndexOutOfBoundsException: 15

 

CopyOnWriteArrayList   锁 + 数组拷贝 + volatile 实现线程安全

 

为什么加锁了还要CopyOnWrite?

  1、volatile修饰的Object数组,在内部数据变化时不能消除内存屏障。只有通过更改地址。

  简单的在原来数组上修改其中某几个元素的值,是无法触发可见性的,必须通过修改数组的内存地址才行,也就说要对数组进行重新赋值才行。

  2、在新的数组上进行拷贝,对老数组没有任何影响,只有新数组完全拷贝完成之后,外部才能访问到,降低了在赋值过程中,老数组数据变动的影响。

 

posted @ 2024-02-19 00:27  长寿奉孝  阅读(6)  评论(0编辑  收藏  举报