在 ArrayList 的类注释中,JDK 就提醒了我们,如果要把 Arraylist 作为共享变量的话,是线程不安全的,推荐我们自己加锁或者使用Collections.synchronizedList 方法,其实 JDK 还提供了另外一种线程安全的 List,叫做 CopyOnWriteArrayList,这个 List 具有以下特征:
1、线程安全的,多线程环境下可以直接使用,无需加锁
2、通过锁+数组拷贝+ volatile 关键字保证了线程安全
3、每次数组操作,都会把数组拷贝一份出来,在新数组上进行操作,操作成功之后再赋值回去
4、整体架构
CopyOnWriteArrayList 通过加锁+数组拷贝+ volatile 来保证了线程安全,每一个要素都有着其独特的含义:
1、加锁,保证同一时刻数组只能被一个线程操作;
2、数组拷贝,保证数组的内存地址被修改,修改后触发 volatile 的可见性,其它线程可以立马知道数组已经被修改;
3、volatile,值被修改后,其它线程能够立马感知最新值。
Was this helpful?
0 / 0