我读过一本书,读的ConcurrentHashmap
不能保证最新状态,它有时可以提供更接近的值。这样对吗?
我已经阅读了它的javadocs和许多博客,这些博客似乎在说其他的话(即是准确的)。
哪一个是对的?
最佳答案
直观地讲,ConcurrentHashMap的行为应类似于一组volatile变量。映射键是可变地址。 get(key)
和put(key, value)
的行为应类似于 volatile 读写。
该文档未明确说明。但是,我坚信情况确实如此。否则,将会有很多意想不到的,令人惊讶的行为破坏应用程序逻辑。
我认为Doug Lea不会对我们这样做。可以肯定的是,有人请在concurrency-interest
邮件列表上询问他。
假设它确实遵循可变语义,我们可以基于Java内存模型进行推理-
所有 volatile 读取和写入均形成单个总订单。这可以看作是伪时间线,其中读/写是其上的点。
volatile 读取看到前一个 volatile 写入,并且仅看到该写入。这里的“前”是根据伪时间线。
伪时间线可以与“实际”时间线不同。但是,从理论上讲,在伪时间线上不能无限地延迟 volatile 写入。而且,实际上,两个时间轴非常接近。
因此,我们可以肯定的是, volatile 写入应该对读取“非常快”地变得可见。