|
19
|
| Stu Thompson Helter Scelter · 技术社区 · 16 年前 |
|
|
1
6
这里有一些很好的答案,但据我所知,没有人真正提供一个标准答案来回答这个问题:“ConcurrentHashMap.get()能保证看到不同线程以前的ConcurrentHashMap.put()”。那些说“是”的人还没有提供消息来源。 所以:是的,这是有保证的。 Source (请参阅“内存一致性属性”一节):
|
|
|
2
10
根据在缓存中找不到对象而在缓存中创建昂贵对象的问题是已知问题。幸运的是,这已经得到了实施。 你可以使用 MapMaker 从 Google Collecitons . 只需给它一个创建对象的回调,如果客户机代码在映射中查找而映射为空,则调用回调并将结果放入映射中。
顺便说一句,在您最初的示例中,使用ConcurrentHashMap没有优势,因为您正在锁定每个访问,为什么不在锁定的部分中使用一个普通的HashMap呢? |
|
3
3
要考虑的一件事是,在“get”调用的两次调用中,您的键是否相等,并且具有相同的哈希代码。如果他们只是
在任何情况下,您可能还需要记录用于获取/放入线程1和2中的键的哈希代码。如果这些不同,你就有问题了。还要注意
为了回答你的题目-是的,concurrenthashmap.get()保证能看到前面的put(),其中“previous”表示 以前发生过 Java内存模型指定的两者之间的关系。(尤其是对于ConcurrentHashMap,这基本上是您所期望的,但需要注意的是,如果两个线程在不同的核心上“完全相同的时间”执行,您可能无法判断哪一个先发生。不过,在您的例子中,您应该可以在线程2中看到put()的结果)。 |
|
|
4
3
如果一个线程在并发哈希映射中放置了一个值,那么另一个为该映射检索值的线程将保证看到前一个线程插入的值。 Joshua Bloch在“实践中的Java并发”中澄清了这个问题。 引用文本:
|
|
5
2
我认为问题不在“Concurrenthashmap”中,而是在代码的某个地方,或者关于代码的推理。我无法在上面的代码中发现错误(也许我们只是看不到错误的部分?). 但要回答您的问题,“Concurrenthashmap.get()是否保证看到不同线程以前的Concurrenthashmap.put()”我编了一个小测试程序。 简而言之: 不,Concurrenthashmap没问题! 如果地图写得不好,以下程序将打印“访问错误!”至少时不时的。它向上面概述的方法抛出100个线程和100000个调用。但上面印着“一切正常!”.
|
|
|
6
1
更新:
也许我遗漏了一些明显的东西,但你为什么要用信号灯保护地图?
更直接地回答你的问题:一旦你的put返回,你在map中输入的值将被下一个寻找它的线程看到。 附带说明,只需对其他一些关于将信号量发布放在finally中的注释加+1即可。
|
|
|
7
0
我们看到Java内存模型有趣的表现形式吗?在什么情况下寄存器被刷新到主存储器?我认为可以保证,如果两个线程在同一个对象上同步,那么它们将看到一致的内存视图。 我不知道semphore在内部做什么,它几乎显然必须做一些同步,但我们知道吗? 如果你这样做会怎么样
而不是获取信号量? |
|
|
8
0
为什么要锁定并发哈希映射?通过DEF。它的线程安全。 如果有问题,它在你的锁定代码中。 这就是为什么我们在Java中使用线程安全包的原因。 最好的调试方法是使用屏障同步。 |
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 1 年前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 1 年前 |
|
|
András Takács · Python多线程问题 1 年前 |
|
|
András Takács · Python多线程错误 1 年前 |