可见性:比如,两个线程,一个线程修操作一个数据,更新了主内存之后,另一个线程必须立马能看到(要强制更新自己的工作内存里面的数据,或强制失效);
如果没有可见性,上面的代码,第二个线程可能主存中的变量已经等于1了之后,while了一段时间后才等于true。
原子性:以内存模型图作为例子,线程1执行完read、load、use、assign、store、write之前,不允许线程2执行这些操作;线程1执行完了之后,线程2才允许执行。没有原子性,例如,两个线程同时执行了。
有序性:具备有序性,不会发生指令重排导致我们的代码异常;不具备有序性,可能会发生一些指令重排,导致代码可能会出现一些问题(一般是单线程执行的话,能保证有序性吧)。
对于代码,同时还有一个问题是指令重排序,编译器和指令器,有的时候为了提高代码执行效率,会将指令重排序,就是说比如下面的代码
重排序之后,让flag = true先执行了,会导致线程2直接跳过while等待,执行某段代码,结果prepare()方法还没执行,资源还没准备好呢,此时就会导致代码逻辑出现异常。