Java 外部同步LinkedHashmap

Java 外部同步LinkedHashmap,java,concurrency,Java,Concurrency,不使用Collections.synchronizedMap在外部实现linkedhashmap同步的最佳方法是什么 当使用Collections.synchronizedMap时,整个数据结构都被锁定,因此性能会受到严重影响 锁定数据结构所需部分的最佳方法是什么。e、 g.如果线程正在访问密钥(K1),它应该只锁定数据结构的密钥(K1)和值(v1)部分我认为您可能需要同步后续操作,只需对来自映射的值进行同步: Object value = map.get(key); synchronized(

不使用Collections.synchronizedMap在外部实现linkedhashmap同步的最佳方法是什么

当使用Collections.synchronizedMap时,整个数据结构都被锁定,因此性能会受到严重影响


锁定数据结构所需部分的最佳方法是什么。e、 g.如果线程正在访问密钥(K1),它应该只锁定数据结构的密钥(K1)和值(v1)部分

我认为您可能需要同步后续操作,只需对来自映射的值进行同步:

Object value = map.get(key);
synchronized(value) {
    doSomethingWith(value);
} 
同步到从映射中获取的值是有意义的,因为它们可以同时共享和访问;我上面发布的示例应该满足您的需要。这应该足够了

顺便说一句,您还可以通过执行两个嵌套的同步块在键上进行同步:

synchronized(key) {
    Object value = map.get(key);
    synchronized(value) {
        doSomethingWith(value);
    } 
}
密钥通常只是用来访问对象(通过散列)。密钥由散列值匹配,因此通过密钥进行同步对我来说意义不大


或者,如果您不需要
LinkedHashMap
,可以将
LinkedHashMap
中缺少的内容添加到子类
ConcurrentHashMap
,使用包中的


它是专为速度和线程安全而设计的。它使用尽可能少的锁来实现线程安全。

最好的选择是使用
java.util.concurrent.ConcurrentHashMap


我看不出如何才能在外部仅锁定zour Map的一部分,因为您无法控制通过调用任何maps函数在内部访问哪些共享数据结构。

在HashMap或LinkedHashMap中插入,可能会导致重新刷新,因为这会增加大小和存储桶数之间的比率。让两个或两个以上的线程同时重新刷新将是一场灾难

即使您只是执行一个get,另一个线程也可能正在从同一个bucket中删除一个条目,因此您正在扫描正在您下面修改的链接列表。您还可以同时将两个或多个线程附加到主链接列表


如果可以不使用链接,请使用java.util.concurrent.ConcurrentHashMap,如前所述。

您无法从内置java实现中获得细粒度的锁定、FIFO逐出并发映射


查看或使用开源软件。

路易斯·沃瑟曼的建议可能是最好的,因为它提供了很多有用的功能。然而,即使您锁定了整个映射,您也必须非常非常困难地将其作为瓶颈(例如,您的代码主要是在映射上进行读/写)。如果您不需要Guava的
缓存
的附加功能,那么同步地图可能会更简单、更好。如果您主要从映射中读取,也可以使用
ReadWriteLock

它是链接映射的绝对要求吗?是的,我想要一个具有高效FIFO逐出策略的哈希映射。Linkedhashmap是我认为唯一需要链接的数据结构(至少我是这么认为的),因为我正在寻找一个带有fifo逐出策略的hashmap实现。它不应该重新刷新(或增加容量),但应该根据FIFO策略退出。如果您只需要FIFO,您可以创建自己的类,该类围绕ConcurrentHashMap来维护FIFO。当然,您需要小心确保FIFO本身是一个并发数据结构,并且与哈希映射一致。