java - volatile 变量的工作

标签 java multithreading volatile

我正在尝试了解 volatile 变量的工作原理。我创建了一个简单的类“A”,它扩展“Thread”并具有一个 volatile 变量“i”。还有另一个类“Amain”运行“A”类的 3 个线程。我正在 A 的 run() 内部运行一个循环,它依赖于这个 volatile 变量。这是代码。

// Thread

public class A extends Thread {

    public volatile int i = 0;

    @Override
    public void run() {

        while(i<10)
            System.out.println(i++ + "  " + this.getName());
    }
}

// Main Class

public class Amain {

    public static void main(String[] args) {

        A t1 = new A();
        A t2 = new A();
        A t3 = new A();

        t1.start();
        t2.start();
        t3.start();
    }

}

如果 volatile 值在所有线程之间共享,那么“i”应该被打印 10 次。相反,它为每个线程打印 10 个值,即总共 30 个值。需要了解这段代码上下文中 volatile 的工作原理。另外,我该怎么做才能从任意数量的线程中仅获取 10 个 i 值(在此代码的上下文中)。

最佳答案

在您的情况下,您创建了三个单独的 A 对象,每个对象都有其单独的 i 字段,因此这里没有共享状态。如果您希望共享变量,请将其声明为static:

public static volatile int i = 0;

请注意,即使变量是 volatile 的,递增它仍然是不安全的。使用AtomicInteger相反。

关于java - volatile 变量的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30318493/

相关文章:

java - 在cmd中运行maven项目

java - 如何在p2p应用程序中随机选择谁开始游戏/聊天?

JAVA:可以将可运行线程添加到队列中吗?

c++ - 使用覆盖 operator-> 的代理同步对象

C++ 结构和 volatile

c++ - 副作用/ volatile /复制构造函数/析构函数

java - 无法使用 java 将数据从我的服务器添加到 firebase

java - hibernate 删除查询不起作用

java - HTTP 状态 500 - 在第 6 行处理 JSP 页面/login.jsp 时发生异常。(错误消息标题)

c - 为什么在一个序列点内最多只能有一个具有 volatile 限定类型的读取访问?