Volatile 线程可见性

验证线程可见性Demo:

public class VolatileTest {

    /**
     * 循环标记,true:持续循环,false:停止循环。
     */
    private volatile boolean loopFlag = true;

    /**
     * 验证volatile线程可见性
     */
    @Test
    public void volatileTest() {
        // 创建线程t1
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("t1 running============");
                /**
                 * loopFlag没有volatile修饰时,主线程修改loopFlag对t1线程不可见,while循环会一直执行;
                 * loopFlag有volatile修饰时,主线程修改loopFlag对t1线程可见,while循环会被终止。
                 */
                while(loopFlag) {
                }
                System.out.println("t1 end============");
            }
        }, "t1").start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 循环标记修改为false,终止线程t1循环
        loopFlag = false;

        // 当有多个线程存活,主线程让步,不结束作业
        while (Thread.activeCount() > 1) {
            Thread.yield();
        }
    }
}

结论:

当没有volatile修饰时输出如下,主线程修改数据对t1线程不可见:

t1 running============

当有volatile修饰时输出如下,主线程修改数据对t1线程可见:

t1 running============

t1 end============

线程不可见原因:

每个线程会将成员变量保存一份备份到各自线程的工作内存,而各线程之间内存是私有的,除非更新到主内存,才会被其他线程看到。

Volatile 线程可见性_第1张图片

你可能感兴趣的:(JVM,Java,多线程,java,jvm)