首页 > 解决方案 > 一段关于Java关键字volatile的代码

问题描述

我写了一段如下代码来测试关键字 volatile 的功能。如果我运行它,线程“BBB”将永远不会跳出循环。

我可以在 MyDate 的字段编号中添加 volatile 以使其在不同线程之间可见,这可以使程序正常完成。但是如果没有 volatile 关键字,如果我在 RunnableTwo.run() 的 While 块中写一些不相关的语句,也可以使程序正常运行。那么这里到底发生了什么?

class MyData {
    int number = 0;

    public void changeNumber() {
        this.number = 60;
    }
}

class RunnableOne implements Runnable {
    private MyData myData;

    public RunnableOne(MyData myData) {
        this.myData = myData;
    }

    @Override
    public void run() {
        {
            System.out.println("Thread" + Thread.currentThread().getName() + "init with the data:" + myData.number);
            try {
                Thread.sleep(200);
            } catch (Exception e) {
                e.printStackTrace();
            }
            myData.changeNumber();
            System.out.println("Thread" + Thread.currentThread().getName() + "finish with the data:" + myData.number);
        }

    }
}


class RunnableTwo implements Runnable {
    private MyData myData;

    public RunnableTwo(MyData myData) {
        this.myData = myData;
    }

    @Override
    public void run() {


        System.out.println("Thread" + Thread.currentThread().getName() + "init with the data:" + myData.number);
        while (myData.number == 0) {
            //System.out.println("wait");

        }

        System.out.println("Thread" + Thread.currentThread().getName() + "finish with the data:" + myData.number);

    }


}


public class VolatileDemo {
    public static void main(String[] args) {
        MyData myData = new MyData();
        new Thread(new RunnableOne(myData), "AAA").start();
        new Thread(new RunnableTwo(myData), "BBB").start();
    }
}

标签: javamultithreadingvolatile

解决方案


推荐阅读