1

我有一个用于从持久性项目加载的类,在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 的情况下才能等待其他呼叫。

最好的方法是什么?

4

1 回答 1

1

我想实现你想要的唯一方法是编写一个Custom LockusingAbstractQueuedSynchronizer它将根据你传递的整数创建锁,但强烈不推荐

在整数值上同步提供了解决方案,ConcurrentHashMap但它有其自身的缺陷。当您获得相同的锁时,您无法从映射中删除值,因此除非您编写不想要Synchronized的实例,否则无法删除值。ConcurrentHashMap

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

于 2012-10-12T07:41:02.740 回答