什么是cas
全称compare and swap(compare and exchange) 比较并交换
CAS图
场景1
场景:代码对着某个int属性加一,单线程没问题,但是多线程的时候会有问题,因此要加锁
假如不加锁synchrnoized的情况下,可以用上面的cas
但是这种操作会引发ABA问题
解决方法:加版本号进行判断(每次改的时候加个版本号,然后返回时进行判断)
在java中的应用
public class AtomicIntegerTest {
//AtomicInteger典型的cas
private static AtomicInteger m = new AtomicInteger ( 0) ;
public static void main(String[] args) throws Exception {
Thread[] threads = new Thread[100];
CountDownLatch latch = new CountDownLatch(threads.length);
Object o = new Object();
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread(() -> {
for (int j = 0; j < 10000; j++) {
m.incrementAndGet(); //m++
}
latch.countDown();
});
}
Arrays.stream(threads).forEach((t) -> t.start());
latch.await();
System.out.println(m);
}
}
incrementAndGet()点进去看
/**
* Atomically increments by one the current value.
*
* @return the updated value
*/
public final int incrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
getAndAddInt点进去看
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}
compareAndSwapInt这里用到了cas
compareAndSwapInt点进去看
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
场景2
synchrnoized里面也有用到