java - java多线程程序中的Volatile变量

标签 java multithreading variables volatile java-threads

为什么多线程小程序中的原始变量表现得像一个 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/

相关文章:

java - 使用 Glassfish 和 RESTful Web 服务响应 404 错误的简单 JMS 示例

javascript - AngularJS:$http从外部文件获取Json

variables - 我想做vhdl除法器

php - 如何列出文件中的所有 PHP 变量?

python - 多个线程从 Linux 上的单个文件夹读取

java - 如何从 fragment 类访问适配器类的方法

java - 线程连接在 Android 中不起作用?

java - 将当前目录添加到 JAR 文件的类路径

C++ - 在同一程序中运行一个服务器线程和一个客户端线程

Java:如果加入线程不起作用:中断还是继续?