为什么多线程小程序中的原始变量表现为易变量?请帮我处理我的代码。
/**
* 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;
}
}
}
}
}
答案 0 :(得分:2)
为什么多线程小程序中的原始变量,表现为易变变量
这取决于你的意思表现为易变变量。
如果您的意思是,为什么在第二个线程中看到一个线程所做的更改...那么原因是JLS 允许此。
如果您的意思是,为什么在第二个帖子中可以看到由一个帖子保证所做的更改...那么您的程序不会提供证据 1 这个!!
普通变量和volatile
变量之间可见性语义的差异是:
对于volatile
,保证更改立即可见。
对于普通变量,更改可以立即可见,或者延迟,或者......永远不可见。任何这些行为都符合Java内存模型。
在运行一组应用程序运行等的计算机上,在一个硬件平台上运行程序并使用一个版本的Java编译器时,查看普通变量的更改并不意味着您将始终看到所有这些情况。
1 - 实际上,理论上不可能编写一个可以执行此操作的程序。但是你的程序可以提供证据证明这不能保证......或者(假设的)保证没有得到满足。