使用AtomicXXX类
AtomicInteger count = new AtomicInteger(0)
/*synchronized*/ void m(){
for(int i = 0; i < 10000; i++){
//count ++ ;
count.incrementAndGet(); // 自增并拿到这个值
}
}
因为像自加自减等在代码中比较频繁出现,如果每次都加锁就比较麻烦。所以Java提供了AtomicXXX类,这些类里面用到了CAS,号称无锁。
原理
这些类里面会调用一个方法 compareAndSet
compareAndSet(V, Expected, NewValue)
if V == Expected
V = NewValue
otherwise try again or fail
v – 原来的值
Expected – 期望的值
NewValue – 新值
当前线程想改原来的值即V,先判断下是否跟期望的值(Expected)相同,如果相同就把新值赋值给原来的值;如果不相同,即想改值得过程中有其他线程参与进来并且改动了原来的值,这时V 就不等于 Expected,就会执行try angain 重试一次。