volatile无法保证原子性,原子类操作出现,无法保证原子性的原因上篇有说。
以i++举例
内存图如下,
1.普通情况下,由于i++存在读写改三步操作,必然出现并发异常
1.sn=0
2.T1->sn=0+1
2.T2->sn=0+1
3.sn=1
3.sn=1
期待值->2
实际值->1
2.volatile修饰
相当于T1,T2全部从主存中进行读写改操作,由于不在同一个线程,此时也会出现
1.sn=0
2.T1->sn=0+1
2.T2->sn=0+1
3.sn=1
3.sn=1
期待值->2
实际值->1
3.使用原子类(使用volatile保证内存可见性,CAS实现原子性)
CAS(Compare-And-Swap)包含三个操作数
1.内存值 A
2.预估值 B
3.更新值 C
当且仅当A==B时候,A=C,否则不做操作
T1:
A->0
B->0
C->1
T2:
A->0
B->1
C->1
T1先改后,T2,A!=B,不做任何操作,保证原子性