CopyOnWriteArrayList线程案例集合
ArrayList是线程不安全的.
- 有时两个线程会争抢一个对象
- 两个线程同时向一个索引位置存储数据
CopyOnWriteArrayList具有原子性
package com.li.changGe.multithreading.threadSafety;
import java.util.ArrayList;
import java.util.concurrent.CopyOnWriteArrayList;
public class CopyOnWriteArrayListDemo01 extends Thread{
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
CopyOnWriteArrayList<Object> copyList = new CopyOnWriteArrayList<>();
CopyOnWriteArrayList<Object> copyList1 = new CopyOnWriteArrayList<>();
for (int i = 0; i < 10000; i++) {
/**
* 解决方法一:加锁
*
* 虽然还是会有偏差,但是copyList始终比list准确
* 最好给copyList也加个锁,有时也会出有偏差
*/
new Thread(() -> {
synchronized (list){
list.add(1);
copyList.add(2);
}
}).start();
copyList1.add(3);
}
System.out.println("list"+list.size());
System.out.println(copyList.size());
System.out.println(copyList1.size());
}
}
原本不给List集合加锁时,程序运行后发现list的长度距离10000相差很远
给list加锁后,偏差少了.而copyList即使加锁有时也会有少许偏差
下图分别是list(未加锁),copyList(加锁)和正常运行后的长度