java多线程程序中的Volatile变量
为什么在多线程小程序中,原语变量表现为一个易失变量?请帮我输入密码java多线程程序中的Volatile变量,java,multithreading,variables,volatile,java-threads,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
/**
* 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();
}
类,并在睡眠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);
}
}
}
公共静态类循环器扩展线程{
@凌驾
公开募捐{
while(可视性问题countingVal<5){
可视性问题.countingVal++;
试一试{
睡眠(500);
}捕捉(中断异常e){
e、 printStackTrace();
}
System.out.println(“增加”+可视性问题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;
}
}
}
}
}
公共静态类侦听器扩展线程{
@凌驾
公开募捐{
int localCount=VisibilityProblem.countingVal;
while(localCount<5){
if(localCount!=VisibilityProblem.countingVal){
System.out.println(“现在是“+localCount+”);
localCount=VisibilityProblem.countingVal;
}
}
}
}
}
为什么在多线程小程序中,原语变量表现为一个易失变量
这取决于你所说的作为一个易变变量的行为是什么意思
- 如果你的意思是,为什么在第二个线程中看到一个线程所做的更改。。。那么原因是JLS允许这样做
- 如果您的意思是,为什么一个线程所做的更改可以保证在第二个线程中看到。。。那么你的程序没有提供这方面的证据
volatile
变量之间的可见性语义差异如下:
- 对于
,更改保证立即可见易失性
- 对于普通变量,变化可能立即可见,或延迟可见,或。。。从未。所有这些行为都符合Java内存模型
事实上,从理论上讲,编写一个能够做到这一点的程序是不可能的。但是你的程序可以提供证据证明这不是保证。。。或者未满足(假设的)担保 为什么在多线程小程序中,原语变量表现为一个易失变量 这取决于你所说的作为一个易变变量的行为是什么意思
- 如果你的意思是,为什么在第二个线程中看到一个线程所做的更改。。。那么原因是JLS允许这样做
- 如果您的意思是,为什么一个线程所做的更改可以保证在第二个线程中看到。。。那么你的程序没有提供这方面的证据
volatile
变量之间的可见性语义差异如下:
- 对于
,更改保证立即可见易失性
- 对于普通变量,变化可能立即可见,或延迟可见,或。。。从未。所有这些行为都符合Java内存模型
事实上,从理论上讲,编写一个能够做到这一点的程序是不可能的。但是你的程序可以提供证据证明这不是保证。。。或者未满足(假设的)保证。对于非易失性变量,只有在不执行同步操作的情况下,才能看到更改。。。我知道这一点。然而,问题是关于易变变量和普通变量之间的差异,以及如何编写一个可靠地证明这种差异的程序。我理解。我的评论是这样的:“从不”只是在这个具体案例中永远符合JMM。实际上,读过这句话的人可能会认为,无论在什么情况下,非易失性字段上的更改都不可见是可以的。如果您发现这与答案不相关,那么它首先就不应该存在,或者将“从不”替换为“直到下一个同步操作,这可能永远不会发生”。“照这样,读过这句话的人可能会认为,在任何情况下,非易失性字段上的更改都不可见是可以的。”-根据JLS,变更不可见是可以的。因此,如果人们相信这一点,那么他们是绝对正确的。这正是我想表达的观点。请注意我对“可能”一词的谨慎使用……简言之。。。你所说的是对的,但它偏离了我想表达的观点。(这与问题无关……因为问题中没有公开的同步操作!)对于非易失性变量,只有在没有同步操作的情况下,更改才可能永远不可见。。。我知道这一点。然而,问题是关于易变变量和普通变量之间的差异,以及如何编写一个可靠地证明这种差异的程序。我理解。我的评论是这样的:“从不”只是在这个具体案例中永远符合JMM。实际上,读过这句话的人可能会认为,无论在什么情况下,非易失性字段上的更改都不可见是可以的。如果你发现这与答案不相关,那就错了