作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我对 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/
我是一名优秀的程序员,十分优秀!