java中多线程程序中的易失性变量

时间:2017-09-24 10:55:10

标签: java multithreading variables volatile java-threads

为什么多线程小程序中的原始变量表现为易变量?请帮我处理我的代码。

/**
 * Practice with threads problem visibility.
 * @author Matevosyan Vardan
 * @version 1.0
 * created on 21.09.2017
 */

public class VisibilityProblem {
    private static int countingVal = 0;

    public static int getCountingVal() {
        return countingVal;
    }

从主

开始
    public static void main(String[] args) throws InterruptedException {
       Thread looperR = new VisibilityProblem.Looper();
        Thread listener = new VisibilityProblem.Listener();

        listener.start();
        looperR.start();

        listener.join();
        looperR.join();
    }

在slepp 500毫秒之后改编并增加计数变量的类 等一下,有什么帮助做一些员工的监听线程。

    public static class Looper extends Thread {
        @Override
        public void run() {
            while (VisibilityProblem.countingVal < 5) {
                VisibilityProblem.countingVal++;
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("increase " + VisibilityProblem.countingVal);
            }
        }
    }

要读取和分配计数值的类

    public static class Listener extends Thread {
        @Override
        public void run() {
            int localCount = VisibilityProblem.countingVal;
            while (localCount < 5) {
                if (localCount != VisibilityProblem.countingVal) {
                    System.out.println("It is " + localCount + " now");
                    localCount = VisibilityProblem.countingVal;
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

  

为什么多线程小程序中的原始变量,表现为易变变量

这取决于你的意思表现为易变变量

  • 如果您的意思是,为什么在第二个线程中看到一个线程所做的更改...那么原因是JLS 允许此

  • 如果您的意思是,为什么在第二个帖子中可以看到由一个帖子保证所做的更改...那么您的程序不会提供证据 1 这个!!

普通变量和volatile变量之间可见性语义的差异是:

  • 对于volatile,保证更改立即可见。

  • 对于普通变量,更改可以立即可见,或者延迟,或者......永远不可见。任何这些行为都符合Java内存模型。

在运行一组应用程序运行等的计算机上,在一个硬件平台上运行程序并使用一个版本的Java编译器时,查看普通变量的更改并不意味着您将始终看到所有这些情况。

1 - 实际上,理论上不可能编写一个可以执行此操作的程序。但是你的程序可以提供证据证明这不能保证......或者(假设的)保证没有得到满足。

相关问题