【发布时间】:2018-10-25 06:19:12
【问题描述】:
在通过put 方法写入值时,如果另一个线程尝试读取同一个键的值,读取线程会得到什么?旧值、新值还是一些“垃圾”值?
【问题讨论】:
标签: java multithreading java.util.concurrent concurrenthashmap
在通过put 方法写入值时,如果另一个线程尝试读取同一个键的值,读取线程会得到什么?旧值、新值还是一些“垃圾”值?
【问题讨论】:
标签: java multithreading java.util.concurrent concurrenthashmap
如果第一个线程的put 操作已完成,第二个线程的get 将看到新值。否则,它将看到旧值。
请注意,在此上下文中,“已完成”不是一个明确定义的概念。该操作可以被视为在put 调用返回之前完成。
但您可以依靠两件事:
put之前对对象所做的所有写入。Java 内存模型保证了后者,这是 javadoc 所讨论的 happens-before 的结果。
1 - 这假设在第一个线程的 put 和访问由 get 返回的对象的第二个线程之间的中间间隔内没有对对象的其他更新。
【讨论】:
get的调用甚至可以在@987654328之前取回值吗? @call返回——表示值已经写入map,但是方法调用还没有返回
put 完成工作和返回之间会有一个很小的窗口。 (我有点迂腐……)
来自Javadoc:
检索反映了最近完成更新操作在开始时保持的结果。 (更正式地说,给定键的更新操作与报告更新值的键的任何(非空)检索具有发生前的关系。)
【讨论】: