CAS:
jdk1.5之前都是通过synchronized来实现同步的,这就导致有锁
锁机制问题:
1.多线程竞争下,加锁和释放锁,会导致比较多的上下文切换和调度延时,引起性能问题
2.一个线程持有锁会导致其他所有需要此锁的线程挂起
3.如果一个优先级高的线程等待一个优先级低的线程释放锁,会导致优先级倒置。
什么是CAS
概念:即比较再交换。
过程:最终调用native的CAS方法
效果:是在不加锁的状态下,在多线程访问时,保证线程数据一致性问题
ABA问题:
其他线程将值修改为A,再修改为B,然后再修改为A,解决方案,修改的值+版本号
原理:
CAS最终是通过调用JNI的代码实现的,JNI:Java Native Interface java本地调用,允许Java调用其他语言
JNI调用c++的代码
C++调用CPU底层指令lock cmpxchg实现的。cas的原子性实际是cpu实现的
在jdk中的应用:
jdk5增加了并发包java.util.concurrent.*,下面的类使用了CAS算法
缺点:
ABA问题:
解决方案是在变量前面加上版本号,每次变量更新的时候把版本号加1,把A-B-A变成1A-2B-3A, jdk1.5中可以使用AtomicStampedReference解决
自旋循环开销时间大
只能保证一个共享变量的原子操作。
来源:oschina
链接:https://my.oschina.net/riseee/blog/3217348