为什么多线程小程序中的原始变量表现得像一个 volatile 变量?请帮助我编写代码。
/**
* 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();
}
在 sleep 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;
}
}
}
}
}
最佳答案
Why do primitive variable in multithreading little program, behave as a volatile variable
这取决于您所说的“表现为 volatile 变量”的含义。
如果您的意思是,为什么一个线程所做的更改会在第二个线程中看到......那么原因是 JLS 允许这样做。
如果您的意思是,为什么一个线程所做的更改保证可以在第二个线程中看到...那么您的程序无法提供证据1 这个!!
普通变量和 volatile
变量之间可见性语义的区别是:
对于
volatile
,更改保证立即可见。对于普通变量,更改可能立即可见,或者延迟,或者......永远不可见。所有这些行为都符合 Java 内存模型。
当您在一个硬件平台上运行程序时,在运行一组应用程序的计算机上使用一种版本的 Java 编译器运行程序时,看到普通变量的变化并不意味着您总是会看到这一点情况。
<小时/>1 - 事实上,理论上不可能编写一个可以做到这一点的程序。但是您的程序可以提供证据证明这不能得到保证......或者(假设的)保证没有得到满足。
关于java - java多线程程序中的Volatile变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46389295/