Java 读取量大但很少修改的集合的访问保护/同步?

Java 读取量大但很少修改的集合的访问保护/同步?,java,synchronization,Java,Synchronization,假设我有一个简单的地图,经常被查询,但只是偶尔被修改。目前,我正在使用同步块在添加到地图时防止竞争条件(简化示例): 公共类MyRepository{ 私有静态HashMap MAP=newhashmap(); 公共静态对象getInstance(整数键){ 同步(地图){ 返回MAP.get(key); } } 公共静态void addInstance(整数键、对象实例){ 同步(地图){ MAP.put(键、实例); } } } 我省略了任何特定于应用程序的废话,比如处理按键碰撞等。你可以

假设我有一个简单的地图,经常被查询,但只是偶尔被修改。目前,我正在使用同步块在添加到地图时防止竞争条件(简化示例):

公共类MyRepository{
私有静态HashMap MAP=newhashmap();
公共静态对象getInstance(整数键){
同步(地图){
返回MAP.get(key);
}
}
公共静态void addInstance(整数键、对象实例){
同步(地图){
MAP.put(键、实例);
}
}
}
我省略了任何特定于应用程序的废话,比如处理按键碰撞等。你可以理解,非常简单。在运行时,当应用程序启动时,映射将充满实例。此后,地图很少被修改(可以说是千载难逢)。另一方面,地图经常被查询,查询地图的多个线程相互阻塞


是否有一种保护机制,允许多个“读卡器”同时获取地图,同时一次只调用一个“写卡器”?

您是否查看过JDK 5中的广告?这是针对这个用例的。

一个?

ConcurrentHashMap可能是您最好的解决方案。但是,如果写入非常罕见,您可以保留两个副本,一个是您同步的主副本,另一个是您每次更改第一个映射时都会替换的副本。这使得写操作非常昂贵,但读操作与没有任何锁定一样便宜

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);
        }
    }

}