引入CAS的原因
1.synchronized争夺同一共享资源时,未获得锁的线程会等待,线程挂起与唤醒需要在用户态和内核态进行切换,影响性能
2.volatile可以保证内存的可见性和指令有序性,但是不能保证原子性
3.映入CAS为了保证原子性并且不影响性能。
CAS原理和特点:
先读取内存中的数据,再通过比较是否符合预期,符合就跟新为新值。其实现是基于硬件提供的原子操作指令,实现无锁并发,提高了效率的同时还保证原子性。
三个关键参数:
V:需要读写的内存地址
E:期望的V的值
N:想要写入的新值
过程:
1.比较V和E是否相等
2.相等,将V跟新成N,否则不做修改
3.返回旧值,可以判断是否成功更新
可能的问题
1.ABA问题
当两个线程同时对同一共享数据进行操作如
线程1:读取1,想要修改成2
线程2:在线程1读取后还未修改时线程2将1改成3有改回1后,线程1才进行修改。此时可能导致数据不一致。
ABA解决
(1).增加版本号
2.长时间自旋:占用大量的CPU资源
解决:JVM提供的pause指令,让cpu在自旋失败时睡眠一段时间再继续自旋。