1

タイトルの言葉遣いについては、説明が不十分で申し訳ありません。誰かがそれを編集できれば、それは素晴らしいことです:)

共有状態にアクセスする 4 つのメソッドがあります。現在、それらはスレッドセーフではありません。共有状態はリストです。メソッドのうち 2 つはリストを変更し、2 つはそれを繰り返します。すべてのメソッドを単純に同期することは可能ですが、パフォーマンスが低下します。変更メソッドが実行されていない限り、反復メソッドが複数のスレッドで同時に実行されても完全に安全です。

複数のリーダーを実行できるようにするロック方法、または単一のライターが必要です。

private List<T> list;
public void insert(T t) {// Write shared state
    list.add(t);
}
public void remove(T t) {// Write shared state
    list.remove(t);
}
public void doStuff(T t) {// Read shared state
    // iterate list and do stuff
}
public void doOtherStuff() {// Read shared state
    // iterate list and do stuff
}
4

2 に答える 2

2

おそらくReadWriteLockはあなたのニーズに合っています。スレッドaとはロックbを取得する必要がありますが、スレッドとは読み取りロックを取得する必要がありますwritecd

于 2012-12-26T22:45:16.287 に答える
1

Javaのsynchronizedキーワードでこれを行うことができます。このキーワードは特定のオブジェクトにロックを作成するため、ロックが開いていない限り何かを実行することはできません (実行時にロックが呼び出されます)。この場合、2 つのロックが必要で、特定のオブジェクトをロックする必要があるため、2 つObjectの を作成してそれらをロックするだけで済みます。必要なものはこれです:

a/b:

synchronized(lock1)
{
    synchronized(lock2)
    {
        //do stuff
    }
}

c:

synchronized(lock1)
{
    //do stuff
}

日:

synchronized(lock2)
{
    //do stuff
}

c と d はそれぞれ lock1 と lock2 をロックしますが、これらは互いに競合しないため、同時に実行できます。ただし、a と b を実行するには、両方のロックが解放されている必要があるため、他のメソッドと同時に使用することはできません。

于 2012-12-26T22:31:24.510 に答える