让我们说我有一个简单的地图,经常被查询,但只是偶尔修改。目前我正在使用synchronized块来防止在添加到地图时的竞争条件(简化示例):
public class MyRepository {
private static HashMap<Integer, Object> MAP = new HashMap<Integer, Object>();
public static Object getInstance(Integer key) {
synchronized (MAP) {
return MAP.get(key);
}
}
public static void addInstance(Integer key, Object instance) {
synchronized (MAP) {
MAP.put(key, instance);
}
}
}
我遗漏了任何特定于应用程序的垃圾,比如处理关键碰撞等。你得到的图片非常简单。在运行时,映射在应用程序启动时填充实例。在那之后,地图很少被修改(一旦在蓝色的月亮,所以说)。另一方面,经常查询地图,查询地图的多个线程互相阻塞。
是否有一种保护机制,允许多个“读者”同时掌握地图,同时仍然只有一个“作家”?
答案 0 :(得分:5)
你看过JDK 5的广告ConcurrentHashMap了吗?它适用于此用例
答案 1 :(得分:1)
ReadWriteLock怎么样?
答案 2 :(得分:1)
ConcurrentHashMap可能是您的最佳解决方案。但是,如果写入非常罕见,则可以维护两个副本,即同步的主副本和第二个映射,这是每次更改第一个映射时替换的副本。这使得写入非常昂贵,但读取的成本与没有锁定一样便宜。