gpt4 book ai didi

Java:易变性足以使类线程安全?

转载 作者:搜寻专家 更新时间:2023-11-01 04:00:49 25 4
gpt4 key购买 nike

我对 Java 中的 volatile 语句有疑问。请看这个构造的例子:

class Master {
// Foo is a class with thread-safe methods
public volatile Foo foo;
}

class Worker1 implements Runnable {
protected Master master

void run() { ... };
}

class Worker2 implements Runnable {
protected Master master

void run() { ... };
}

我们有 2 个工作线程,它们持有对同时运行的 Master 类对象的引用。在工作期间,两者都必须访问 master.foo 的方法。在某个时候,master 的 Foo 对象将被其中一个工作线程更改。现在我的问题是:volatile 的使用是否使整个构造线程安全?我问这个是因为在 Java tutorial from Oracle 中它说

However, there are actions you can specify that are atomic:

  • Reads and writes are atomic for reference variables [...]

Atomic actions cannot be interleaved, so they can be used without fear of thread interference.

我只是想确保我理解正确。

提前致谢:)

最佳答案

引用的读取和写入在 Java 中始终是原子的,因此没有危险,例如,看到引用处于某种半更新状态。如果这就是您所说的“线程安全”的意思,那么无论是否使用关键字,该操作都是线程安全的。

但是volatile与原子性无关,它影响线程是否可以在本地缓存写入。 volatile 会强制将写入写回主内存,并对其他线程可见。如果这就是线程安全的意思,那么是的,您需要这个关键字。

volatile 本身不影响 foo 上的方法调用是否排除其他线程。如果这就是您的意思,您希望在不同的地方使用同步

关于Java:易变性足以使类线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8538429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com