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 - 事实上,理论上不可能编写一个程序可以做到这一点。但是您的程序 可以 提供证据证明这不能保证......或者没有满足(假设的)保证。