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

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条)

相关推荐 更多相似问题