循环时间长开销大 (比较旧的预期值和主内存最新的值是一个循环比较过程,如果长时间比较不成功,CPU开
销大)
只能保证一个共享变量的原子操作
对于多个变量操作时,循环CAS无法保证操作的原子性,这个时候就可以用锁来保证原子性
引出来ABA问题
ABA问题
ABA问题的产生: CAS算法实现一个重要的前提需要提取出主内存中的某个时刻的数据值并在当下时刻工作内
存中的值比较替换,那么在这个时间差类会导致数据的变化。 比如:一个线程T1从主内存位置V中取出A,这时
候另一个线程T2从主内存中读取A,并且线程T2进行了一些操作讲述职变成B后更显到主内存中,然后线程T2有
将V位置的数据变成A,这个时候线程T1进行CAS操作发现内存中仍然是A,然后线程T1操作成功。
尽管线程T1操作成功,但并不代表这个过程就没有问题,相当于T1遗漏掉T2更新的一个中间变量值的过程
原子引用
集合类不安全问题
CopyOnWriteArrayList 原理分析
//ArrayList 并发安全是示例 java.util.ConcurrentModificationException
public static void main(String[] args) {
final List<String> list = new ArrayList();
for (int i = 1; i < 100; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
list.add(UUID.randomUUID().toString());
System.out.println(list);
}
});
thread.setName("线程" + i);
thread.start();
}
}
//并发问题原因: 并发争抢修改导致,一个线程正在读,另一个进行写 导致数据不一致
//解决
// 1.List<String> list = new Vector<String>() 使用加锁线程安全的类
// 2.List<String> list = Collections.synchronizedList(new ArrayList()); 包一层安全
// 3.List<String> list = new CopyOnWriteArrayList<String>();