多线程同步java中的持久性加载程序
我在PersistenceController
类中有一个类,用于使用以下方法从持久性项加载:
Item loadItem(int id);
现在我想在其他控制器中实现以下方法:
synchronized Item getItem(int id){
Item result= getItemFromMemory(id);
if (result==null){
result=PersistenceController.loadItem(id);
}
return result;
}
目标是确保同一时间内存中只有一个(或零个)具有相同id的项实例。这种方法有效,但有一个问题:每个加载项必须相互等待。我想更改同步方案,以便只有当两个id相同时,呼叫才能等待其他
最好的方法是什么
# 1 楼答案
我想实现您想要的唯一方法是使用
AbstractQueuedSynchronizer
编写一个Custom Lock
,它将根据您传递的整数创建锁,但强烈建议不要这样做Synchronizing on an Integer value提供了使用
ConcurrentHashMap
的解决方案,但它有自己的缺陷。当您获得相同的锁时,您不能从映射中删除值,因此,除非您写入Synchronized
的ConcurrentHashMap
实例,否则无法删除该值,而您不希望这样做一个相当可行的方法是增加锁的数量