一 点睛
并发编程的三个重要特性是原子性、有序性和可见性。
二 原子性
指在一次的操作或者多次操作中,要么所有的操作全部得到执行并且不会受到任何因素的干扰而中断,要么所有的操作都不执行。
银行转账是原子性最好的例子,转账要么成功,要么失败。不可能出现其他状态。否则就是代码写得有问题,这种情况是客户不允许的。
再举一个例子
Object o = new Object();
引用类型 o 占用四个字节(32位),假设这样的赋值语句不能够保证原子性的话,那么会出现赋值出现错误的数据,所以它也是原子性的。
注意
两个原子性的操作结合在一起未必还是原子的,比如 i++,它包括 get i,i+1,set i=x,三个过程,三个过程都是原子性操作,但不代表 i++ 就是原子性操作。
volatile 关键字不保证数据的原子性,synchronized 关键字保证,从 JDK 1.5 版本开始,其提供的原子类型变量也可以保证原子性。
三 可见性
可见性是指,当一个线程对共享变量进行了修改,那么另外的线程可以立即看到修改后的新值。
new Thread(() -> {
int localValue = init_value;
while (localValue < MAX) {
if (init_value != localValue) {
System.