两个特性 1.可见性 2.禁止指令重排
package org.example.c3;
/***
* 可见性
*
*
// 对一个变量解锁之前,必须先把此变量同步回主存中。这样解锁后,线程就可以访问到被修改后的值。
// 所以Synchronized锁住的对象,其值具有可见性。
*/
public class C1_VisibilityTest {
static volatile Boolean always = true;
public static void main(String[] args) throws InterruptedException {
// 线程1
new Thread(() -> {
//
while (always) {
// System.out.println("执行...");
// synchronized (always) {
//
// }
}
}).start();
Thread.sleep(2000);
// 线程2
always = false;
}
}
这⾥很直观的感受到volatile的效果:被volatile修饰的变量能够保证每个线程能够获取该变量的最新值。 当flag加了volatile关键字修饰时,线程2修改完flag的值之后线程1能感受到flag变量被修改了,为什么会这样⼦呢?下⾯结合JMM原⼦性操作对实现机制进⾏深⼊讲解。