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 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题