`ConcurrentHashMap :: get`方法可以返回“脏”值kkkjjjjj吗?

时间:2018-05-15 12:06:50

标签: java multithreading java.util.concurrent concurrenthashmap

当通过void方法写入值时,如果另一个线程试图读取同一个键的值,那么读者线程会得到什么?旧值,新值或某些“垃圾”值?

2 个答案:

答案 0 :(得分:1)

如果第一个线程的get操作已完成,则第二个线程put将看到新值。否则,它将看到旧值。

请注意"已完成"在这种情况下,这不是一个明确定义的概念。在put调用返回之前,可以认为操作已完成

可以依赖两件事:

  • 第二个帖子看不到垃圾参考。它始终是对有效对象的引用。
  • 第二个帖子 1 能够在调用put之前看到第一个线程对该对象所做的所有写入。

后者由Java内存模型保证,因为javadoc谈论的发生在之前。

1 - 假设在第一个线程的put和访问get返回的对象的第二个线程之间的间隔期间没有对象的其他更新

答案 1 :(得分:0)

来自Javadoc

  

检索反映了最近已完成更新操作的结果。 (更正式地说,给定密钥的更新操作与报告更新值的该密钥的任何(非空)检索之前发生关系。)