在java中同步持久性加载程序

在java中同步持久性加载程序,java,multithreading,synchronization,thread-safety,Java,Multithreading,Synchronization,Thread Safety,我在PersistenceControllerclass中有一个类,用于使用以下方法从持久性项加载: Item loadItem(int id); 所以现在我想在其他控制器中实现以下方法: synchronized Item getItem(int id){ Item result= getItemFromMemory(id); if (result==null){ result=PersistenceController.loadItem(id); }

我在
PersistenceController
class中有一个类,用于使用以下方法从持久性项加载:

Item loadItem(int id);
所以现在我想在其他控制器中实现以下方法:

synchronized Item getItem(int id){
    Item result= getItemFromMemory(id);
    if (result==null){
        result=PersistenceController.loadItem(id);
    } 
    return result;
}
目标是确保同一时间内存中只有一个(或零个)具有相同id的项实例。此方法有效,但有一个问题:每个加载项都必须相互等待。我想更改同步方案,以便只有当两个id相同时,调用才能等待其他


最好的方法是什么?

我想实现您想要的唯一方法是使用
AbstractQueuedSynchronizer
编写一个
自定义锁,该锁将根据您传递的整数创建锁,但强烈不推荐使用

提供了使用
ConcurrentHashMap
的解决方案,但它有自己的缺陷。当您获得相同的锁时,无法从映射中删除该值,因此除非您编写您不想要的
ConcurrentHashMap
实例,否则无法删除该值


一个相当可行的方法是增加锁的数量。

我想实现您想要的唯一方法是使用
AbstractQueuedSynchronizer
编写一个
自定义锁,它将根据您传递的整数创建锁,但强烈建议不要这样做

提供了使用
ConcurrentHashMap
的解决方案,但它有自己的缺陷。当您获得相同的锁时,无法从映射中删除该值,因此除非您编写您不想要的
ConcurrentHashMap
实例,否则无法删除该值


一个相当可行的方法是增加锁的数量。

然后必须在id上设置锁。请看这个答案[1]:您的ID真的表示为int原语吗?如果将对象用于id类,则可以在id对象本身上进行同步,而不是同步getItem方法。我不知道可以从整数中获取互斥。我有个问题吗?如果在程序的另一部分中使用相同的技术(用于其他不相关的任务)而ID发生冲突怎么办?这可能会导致不正确的等待,对吗?。我正在考虑使用SparseArray来处理锁是否正确?看起来您正在尝试运行自己的缓存。我建议:不要这样做。查看框架的缓存机制。然后必须锁定id。请看这个答案[1]:您的ID真的表示为int原语吗?如果将对象用于id类,则可以在id对象本身上进行同步,而不是同步getItem方法。我不知道可以从整数中获取互斥。我有个问题吗?如果在程序的另一部分中使用相同的技术(用于其他不相关的任务)而ID发生冲突怎么办?这可能会导致不正确的等待,对吗?。我正在考虑使用SparseArray来处理锁是否正确?看起来您正在尝试运行自己的缓存。我建议:不要这样做。查看框架的缓存机制。