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内存模型

当您在一个硬件平台上运行程序,在一台运行一组应用程序的计算机上运行一个版本的Java编译器时,看到普通变量的变化并不意味着您在所有情况下都会看到


事实上,从理论上讲,编写一个能够做到这一点的程序是不可能的。但是你的程序可以提供证据证明这不是保证。。。或者未满足(假设的)担保

为什么在多线程小程序中,原语变量表现为一个易失变量

这取决于你所说的作为一个易变变量的行为是什么意思

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

  • 如果您的意思是,为什么一个线程所做的更改可以保证在第二个线程中看到。。。那么你的程序没有提供这方面的证据

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

  • 对于
    易失性
    ,更改保证立即可见

  • 对于普通变量,变化可能立即可见,或延迟可见,或。。。从未。所有这些行为都符合Java内存模型

当您在一个硬件平台上运行程序,在一台运行一组应用程序的计算机上运行一个版本的Java编译器时,看到普通变量的变化并不意味着您在所有情况下都会看到



事实上,从理论上讲,编写一个能够做到这一点的程序是不可能的。但是你的程序可以提供证据证明这不是保证。。。或者未满足(假设的)保证。

对于非易失性变量,只有在不执行同步操作的情况下,才能看到更改。。。我知道这一点。然而,问题是关于易变变量和普通变量之间的差异,以及如何编写一个可靠地证明这种差异的程序。我理解。我的评论是这样的:“从不”只是在这个具体案例中永远符合JMM。实际上,读过这句话的人可能会认为,无论在什么情况下,非易失性字段上的更改都不可见是可以的。如果您发现这与答案不相关,那么它首先就不应该存在,或者将“从不”替换为“直到下一个同步操作,这可能永远不会发生”。“照这样,读过这句话的人可能会认为,在任何情况下,非易失性字段上的更改都不可见是可以的。”-根据JLS,变更不可见是可以的。因此,如果人们相信这一点,那么他们是绝对正确的。这正是我想表达的观点。请注意我对“可能”一词的谨慎使用……简言之。。。你所说的是对的,但它偏离了我想表达的观点。(这与问题无关……因为问题中没有公开的同步操作!)对于非易失性变量,只有在没有同步操作的情况下,更改才可能永远不可见。。。我知道这一点。然而,问题是关于易变变量和普通变量之间的差异,以及如何编写一个可靠地证明这种差异的程序。我理解。我的评论是这样的:“从不”只是在这个具体案例中永远符合JMM。实际上,读过这句话的人可能会认为,无论在什么情况下,非易失性字段上的更改都不可见是可以的。如果你发现这与答案不相关,那就错了