【发布时间】:2014-05-25 13:16:16
【问题描述】:
...没有额外的同步?下面的 Tree 类旨在被多个线程访问(它是一个单例,但不是通过枚举实现的)
class Tree {
private volatile Node root;
Tree() {
root = new Node();
// the threads are spawned _after_ the tree is constructed
}
private final class Node {
short numOfKeys;
}
}
-
numOfKeys字段的更新是否会在没有任何显式同步的情况下对读取器线程可见(请注意,读取器和写入器都必须获取ReentrantReadWriteLock的实例 - 每个节点的相同实例 - 但除非这样做)?如果不是,让numOfKeysvolatile 就足够了吗? - 更改根就像
root = new Node()一样简单(只有编写器线程会更改根,除了调用 Tree 构造函数的主线程)
相关:
- multiple fields: volatile or AtomicReference?
- Is volatile enough for changing reference to a list?
- Are mutable fields in a POJO object threadsafe if stored in a concurrentHashMap?
- Using volatile keyword with mutable object
编辑:对 Java 5 后的语义感兴趣
【问题讨论】:
-
我不明白
ReentrantReadWriteLock的部分。有 ReadWriteLock 吗?或者问题是没有 ReadWriteLock 是否可能? -
@nosid:编辑了这个问题——我提到了锁,因为它的存在是为了协调读者/作者,它可能会有所作为——但问题不在于锁只是访问时必要的同步可变对象的字段
-
您可能希望将该内部类设为静态以提高内存效率。
-
@DavidEhrmann:这是非静态内部类的罕见用途之一(至少在我的设计中) - 节点必须知道树(为了记录,它是基于磁盘的 b+ 树)跨度>
标签: java multithreading volatile java-memory-model