原子性
原子性(Atomicity):一个操作是不可中断的,要么全部执行成功要么全部执行失败。
在典型的转账场景中,入账和出账操作要么同时成功,要么同时失败。其操作过程是一个整体不可分割,这种操作就是原子性的操作。
int a = 1;//1
a++;//2
int b = a;//3
通过上面的伪代码来解释下什么是原子性操作。首先java内存模型中定义了8种操作都是原子的,不可再分的(java内存模型-内存间的八种同步操作)。而八种操作执行期间可能会被插入其他操作。所以八种操作的组合并不是原子性的。
第一行,是将1赋值给线程工作内存的变量a。执行了assign操作,该操作是原子性的不可在分的。
第二行,实际执行的是 读取变量a,执行了use。cpu执行加1操作,将cpu运算完成的值写回变量a,执行了assign操作。时间上是三个操作,由于执行了3条指令所以并不是原子性的。
第三行,实际执行的是 读取变量a,赋值给变量b。由于执行了2条指令所以该操作也不是原子性的。
注:可以通过 synchronized和Lock实现原子性。因为synchronized和Lock能够保证任一时刻只有一个线程访问该代码块。在无其他线程干扰的情况下单线程的原子性JMM是可以保证的。
Java提供的核心类是Atomic包中的类.
java.util.concurrent.atomic.*