为什么会提出这三个特性呢,就是说,如果某段代码不满足 原子性/可见性/有序性 那么就可能产生并发安全问题。
原子性(我的理解):对于代码段,一次只允许一个线程执行
可见性:变量被修改后,对其他线程立马可见
有序性:代码禁止重排序
违反原子性举例:
首先我们保证可见性和有序性
i++;
多个线程同时执行上述操作
违反可见性举例:
if(i<0){
i++;
}
首先我们包证有序性和这块代码的原子性,即一次只允许一个线程执行。
初始时,i=-1,线程A执行代码块,结果i变成0了,紧接着线程B执行代码块,在判断时没有看到线程A对变量i的更新,进入if逻辑,再次读取i,看到了线程A对i的更新,B执行后i变成了1。最好i变成了1,是有问题的。
违反有序性举例
有了原子性和可见性,保障代码线程安全好像够用了。想象我们是jvm的设计者,如果提供解决代码重排问题的工具,被原子性保障的代码块是会出现问题的。比如说代码块A是被原子性保障的,但是代码块A里面的代码可能和外部的代码重排序,结果就是跳出了原来的代码块,那么原来的代码块也就不再满足原子性了