ArrayList线程不安全
多线程下用ArrayList做add操作会出问题。
Exception in thread "pool-8-thread-21" java.lang.ArrayIndexOutOfBoundsException: 15
CopyOnWriteArrayList 锁 + 数组拷贝 + volatile 实现线程安全
为什么加锁了还要CopyOnWrite?
1、volatile修饰的Object数组,在内部数据变化时不能消除内存屏障。只有通过更改地址。
简单的在原来数组上修改其中某几个元素的值,是无法触发可见性的,必须通过修改数组的内存地址才行,也就说要对数组进行重新赋值才行。
2、在新的数组上进行拷贝,对老数组没有任何影响,只有新数组完全拷贝完成之后,外部才能访问到,降低了在赋值过程中,老数组数据变动的影响。
本文来自博客园,作者:长寿奉孝,转载请注明原文链接:https://www.cnblogs.com/tyt0o0/p/18010618