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を持つアイテムのインスタンスを1つ(またはゼロ)だけ確保することです。この方法は機能しますが、1つの問題があります。すべてのロードアイテムは互いに待機する必要があります。両方が同じIDを持っている場合にのみ、他の呼び出しを待機するように同期スキームを変更したいと思います。

これを行うための最良の方法は何ですか?

4

1 に答える 1

1

私はあなたが望むものを達成する唯一の方法はあなたが渡す整数に基づいてロックを作成するCustom Lockusingを書くことだと思いますが、それは強くお勧めしませんAbstractQueuedSynchronizer

整数値で同期すると、を使用した解決策が提供されますConcurrentHashMapが、独自の欠点があります。同じロックを取得した場合、マップから値を削除することはできないため、不要なSynchronizedインスタンスを作成しない限り、値を削除するConcurrentHashMapことはできません。

かなり実行可能なアプローチは、ロックの数を増やすことです。

于 2012-10-12T07:41:02.740 に答える