1

「クリティカルセクション」として機能する共有メモリ(リスト)があるとします。
ここで、これらのシナリオのリストには常にアイテムがあり、システムが次のように動作することを望んでいると考えてください。

  1. Thread1はリストからいくつかのアイテムを取得しますが、同時にThread2はリストにアイテムを追加したいと考えています。このシナリオを許可します(最初から最初のアイテムを取得し、リストの最後に新しいアイテムを同じ時間に挿入すると仮定します)。

  2. Thread1はアイテムを取得したいと同時に、Thread2もアイテムを取得したいと考えています。これは失敗するはずです。

ありがとう

4

1 に答える 1

1

1つの可能性は、getメソッドとaddメソッドをプロキシまたはオーバーライドするクラスでリストをラップすることです。

Lockこのように、メソッドで明示を使用できるため、add一度に1つのスレッドのみを追加できます。

たとえば、次を参照してください。

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html

Listこれを行うには、実装を拡張してaddandgetメソッド(または関連するすべてのメソッド)をオーバーライドするか、継承の代わりにcompositionを使用して、呼び出しをリストに転送するプロキシクラスを作成しますが、addandgetを明示的に取得します。ロックの。

非常に単純な例は次のようになります。

public class SharedMemory<K> {

private final List<K> memoryList;
private static final ReentrantLock lock = new ReentrantLock();

public SharedMemory() {
    memoryList = new ArrayList<>();
}

public void storeItem(K item) {
    memoryList.add(item);
}

public K getItem(int pos){
    lock.lock();
    try{
        return memoryList.get(pos);
    } finally {
        lock.unlock();
    }
}
}
于 2013-01-28T16:56:01.307 に答える