码迷,mamicode.com
首页 > 其他好文 > 详细

volatile的一个经典例子

时间:2018-11-11 16:53:34      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:结束   ext   public   重排序   其他   exce   指令重排序   rgs   线程   

volatile关键字的两层语义

  一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

  1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

  2)禁止进行指令重排序

方式一:变量不使用volatile修饰

public class VolatileTest extends Thread {
    private static boolean flag = false;

    public void run() {
        while (!flag) ;
    }

    public static void main(String[] args) throws Exception {
        new VolatileTest().start();
        Thread.sleep(2000);
        flag = true;
    }
}

方式二:变量使用volatile修饰

public class VolatileTest extends Thread {
    private static volatile boolean flag = false;

    public void run() {
        while (!flag) ;
    }

    public static void main(String[] args) throws Exception {
        new VolatileTest().start();
        Thread.sleep(2000);
        flag = true;
    }
}

结果:
方式一:线程不会结束
技术分享图片

方式二:线程会结束
技术分享图片

volatile的一个经典例子

标签:结束   ext   public   重排序   其他   exce   指令重排序   rgs   线程   

原文地址:https://www.cnblogs.com/hglibin/p/9942486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!