java 多线程程序中的 volatile 变量
Volatile variable in multithreading program in java
为什么多线程小程序中的原始变量表现为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();
}
Class 休眠 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);
}
}
}
Class读取并赋值
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
这取决于您所说的表现为易变变量。
如果您的意思是,为什么一个线程所做的更改会在第二个线程中看到...那么原因是 JLS 允许这样做。
如果你的意思是,为什么一个线程所做的更改保证在第二个线程中看到......那么你的程序没有提供证据1本!!
普通变量和 volatile
变量在可见性语义上的差异是:
对于 volatile
,更改保证立即可见。
对于普通变量,更改可能立即可见,或者延迟,或者...永远不会。这些行为中的任何一个都符合 Java 内存模型。
当你运行一个硬件平台上的程序在一台计算机上Java一个版本的编译器运行一组应用程序[=61]时,看到普通变量的变化=]ning, etc, etc 并不意味着在任何情况下你都会看到它。
1 - 事实上,理论上不可能编写一个程序可以做到这一点。但是您的程序 可以 提供证据证明这不能保证......或者没有满足(假设的)保证。
为什么多线程小程序中的原始变量表现为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();
}
Class 休眠 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);
}
}
}
Class读取并赋值
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
这取决于您所说的表现为易变变量。
如果您的意思是,为什么一个线程所做的更改会在第二个线程中看到...那么原因是 JLS 允许这样做。
如果你的意思是,为什么一个线程所做的更改保证在第二个线程中看到......那么你的程序没有提供证据1本!!
普通变量和 volatile
变量在可见性语义上的差异是:
对于
volatile
,更改保证立即可见。对于普通变量,更改可能立即可见,或者延迟,或者...永远不会。这些行为中的任何一个都符合 Java 内存模型。
当你运行一个硬件平台上的程序在一台计算机上Java一个版本的编译器运行一组应用程序[=61]时,看到普通变量的变化=]ning, etc, etc 并不意味着在任何情况下你都会看到它。
1 - 事实上,理论上不可能编写一个程序可以做到这一点。但是您的程序 可以 提供证据证明这不能保证......或者没有满足(假设的)保证。