CAS是compare and swap,翻译过来就是比较并交换。维护三个变量值,一个是内存值V,一个是期望的旧的值A,一个是要更新的值B。更新一个变量的时候,只有当预期值A与内存V中的值相等的时候,才会执行更新操作,把内存V的值改为B。
从思想上来说,synchronized属于悲观锁,悲观的认为程序中的并发情况严重,所以严防死守,CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去重试更新。在java中,除了Atomic系列类,以及Lock系列类的底层实现,甚至在java1.6以上版本,synchronized在变为重量级锁之前,也会采用CAS机制。
缺点:
- CPU开销过大,因为如果有很多线程一直在反复尝试更新一个变量,却又更新不成功时,就会一直自旋消耗CPU;
- 不能保证代码块的原子性,它只能保证一个变量的原子性;
- ABA问题。(一个值从A变成B,又更新回A,普通CAS会误判通过检测。利用版本号机制可以解决ABA问题。)
unsafe类:
java不能直接访问操作系统底层,而是通过本地方法来访问。unsafe类提供了硬件级别的原子操作,用来获取内存地址的值并进行修改,他的修改逻辑是对比内存地址的值和预期值是否一样,如果一样进行修改。利用的CAS原理。
参考:https://blog.csdn.net/qq_32998153/article/details/79529704