JMM-原子操作CAS
一:概念
CAS是原子类中的compareAndSet方法,这种原子类有:
AtomicInteger
AtomicLong等等
CompareAndSwapObject的缩写,底层采用Unsafe类进行的操作。
Java 并发机制实现原子操作有两种: 一种是锁,一种是CAS。
Synchronized属于悲观锁,悲观地认为程序中的并发情况严重,所以严防死守。CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程去尝试更新,成功则更新,失败返回原来的值。
二:CAS的产生
在修饰共享变量的时候经常使用volatile关键字,但是volatile值有可见性和禁止指令重拍(有序性),无法保证原子性。虽然在单线程中没有问题,但是多线程就会出现各种问题,造成现场不安全的现象。所以jdk1.5后产生了CAS利用CPU原语(不可分割,连续不中断)保证现场操作原子性。
三:Unsafe类
说道CAS就不得不说Unsafe类;CAS底层就是采用的Unsafe操作内存的。
Java无法直接访问底层操作系统,而是通过本地native方法来访问,但还是留了一个后门-Unsafe类,提供了一些低层次操作,如直接内存访问等。
四:Unsafe类中使用自旋锁的方法
注意:下面方法的自旋锁是通过CAS来实现的
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
1:getAndAddInt
首先取内存中的值,然后执行CAS操作,如果成功则返回修改前的值;如果取完内存值后执行CAS失败,比如被其他线程修改了值,则重新取内存中的值,继续CAS,直到成功,getAndAddInt正是乐观锁,用CAS代替锁,如果出现竞争,则用自旋的方式等待;
2:getAndAddLong
3:getAndSetInt
...等等