AtomicInteger通俗的讲就是:对某个内存值拷贝一个副本,
某个线程若读到这个副本,则对其进行计算,输出结果,在写入
内存时,再次取出内存值与该副本比较,若副本与内存值相同
则把新的值写入内存.
较为官方的解释:通过CAS(AtomicInteger)实现,
CAS算法
CAS有三个操作数,内存值V,旧的预期值A,要修改的新值B.当且仅当预期值A和
内存值V相同时,将内存值V修改为B,否则什么都不做.
两个问题:
(1)
CAS算法仍然可能出现冲突,例如A,B两个线程,A已经进入写内存但未完成
,此时A读取到的副本且读取成功,AB两个线程同时进入写内存操作,必然会造
成冲突。 CAS算法本质并非完全无锁,而是把获得锁和释放锁推迟至CPU原语实
现,相当于尽可能的缩小了锁的范围;直接互斥地实现系统状态的改变,它的使
用基本思想是copy-on-write——在修改完对象的副本之后再用CAS操作将副本
替换为正本。
(2)
ABA问题,若其中一个线程修改A->B->A,另外一个线程仍然读取到A,虽然值是
预期值,但并不能说明该内存值没有变化。