【发布时间】:2016-11-23 01:04:10
【问题描述】:
这就是问题所在:我们想要一个其条目是线程安全的哈希表。
假设我有一个<String, Long> 的哈希表,我想安全地增加其中一个条目线程的值:以下可以吗?:
HashMap<String , Long> hashTable = new HashMap<String, Long>();
然后每当我想增加一个条目时:
Synchronized (hashTable.get("key"))
{
Long value = hashTable.get("key");
value++;
hashTable.put("key", value);
}
我认为它比 ConcurrentHashMap 更好,因为它只锁定一个条目,不像 ConcurrentHashMap 使用存储桶,并将一组条目锁定在一起。
更重要的是,我不知道如何安全地使用 COncurrenHashMap 递增它。比如我认为下面的代码是不正确的:
ConcurrentHashMap<String , Long> hashTable = new ConcurrentHashMap<String, Long>();
Long value = hashTable.get("key");
value++;
hashTable.put("key", value);
我认为是不正确的,因为两个线程可以一个接一个地读取key,一个接一个地写入,最终得到一个错误的值。
你们怎么看?
【问题讨论】:
-
你有任何性能数据吗?金钱在这种情况下说话,如果你真的相信你有一些有价值的东西,你应该发布数据,让人们有信心甚至看你的算法。
-
你建议你有一个在并发环境中比 ConcurrentHashMap 更正确或更高效的 Map 版本。除了检查,你的证据是什么?
-
不,我问你:可以吗?
标签: java hashmap synchronized