learningcsdn 2016-02-29 09:50 采纳率: 100%
浏览 1442
已采纳

volatile 关键字 作用结果求解惑

 public class testVolatile {
    private  int i = 0;

    // a线程调用
    public void foo1() {
        try {
            while (true) {
                Thread.sleep(10);
                System.out.println("第一个:" + i);
                i++;
            }
        } catch (InterruptedException e) {
            // not to do;
        }
    }

    // b线程调用
    public void foo2() {
        try {
            while (true) {
                Thread.sleep(10);
                System.out.println("第二个:" + i);
            }
        } catch (InterruptedException e) {
            // not to do;
        }

    }

    public static void main(String[] args) {

        final testVolatile test = new testVolatile();
        // 线程1
        new Thread() {
            public void run() {
                test.foo1();
            }
        }.start();
        // 线程2
        new Thread() {
            public void run() {
                test.foo2();
            }
        }.start();

    }
}

输出结果如下:

 第一个:0
第二个:1
第一个:1
第二个:2
第一个:2
第二个:3
第一个:3
第二个:4
第一个:4
第二个:5
第一个:5
第二个:6
第一个:6
第二个:7
第一个:7
第二个:8
第一个:8
第二个:9
第一个:9
第二个:10
第一个:10

变量i增加volatile 关键字后如下

 第二个:0
第一个:0
第二个:1
第一个:1
第二个:2
第一个:2
第二个:3
第一个:3
第二个:4
第一个:4
第二个:5
第一个:5
第二个:6
第一个:6
第二个:7
第一个:7
第二个:8
第一个:8
第二个:9
第一个:9
第二个:10

求高人指点,变量 i 没有增加 volatile 关键字时,第二个输出为什么会随着第一个i 的变化而变化?

  • 写回答

2条回答

  • 毕小宝 博客专家认证 2016-02-29 10:43
    关注

    你需要了解volatile关键字作用,一个定义为volatile的变量,它将具备两种性质:第一是保证此变量对所有线程的可见性,即当一个线程修改了这个变量后,这个新值对于其他线程来说是立即可见的。第二就是保证不进行指令重排序。
    所以,你没有添加volatile关键字,多线程同时修改变量可能某个线程读到的数据不是最新值,即你的第一个输出结果体现了某个时刻线程1,2同时读到了数值1时,此时线程2可能已经修改了变量。所以导致了不正确的结果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。