有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程同步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) 个答案

  1. # 1 楼答案

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

    Synchronizing on an Integer value提供了使用ConcurrentHashMap的解决方案,但它有自己的缺陷。当您获得相同的锁时,您不能从映射中删除值,因此,除非您写入SynchronizedConcurrentHashMap实例,否则无法删除该值,而您不希望这样做

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