volatile

发布时间 2023-12-04 14:31:07作者: 林浅

两个特性 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原⼦性操作对实现机制进⾏深⼊讲解。