2016-05-01 8 views
0

methodA()methodB()の2つの方法がある場合、methodA()はそれ自体と同期していないので、これらを同期する方法はありますか?つまり、多くのスレッドが同時に実行することがあります。methodA()マルチスレッドプログラムで不要なブロックを回避するにはどうすればよいですか?

  • methodA()へのコールは、methodB()が実行されていないときにブロックする必要があります。
  • methodB()へのコールは、methodB()またはmethodA()のいずれも実行されなくなるまでブロックする必要があります。

答えて

2

ReentrantReadWriteLockを使用できます。

では、readLockをロックし、writeLockをロックするメソッドBでロックします。これにより、メソッドAをいくつかのスレッドで呼び出すことができますが、methodAとmethodB(またはmethodBとmethodB)を同時に呼び出すことはできません。

その他の背景: ReadLockでは並列読み取りが可能です。 WriteLockは排他的なもので、これ以上の読み書きはできません。通常、読み込み中のスレッドがあり、スレッドが書き込みを望む場合は、書き込みスレッドがそのジョブを実行するまで、さらに読み込み要求がキューに入れられます。公正/不公平アルゴリズムと呼ばれ、必要に応じてコンストラクタで設定することができます。

+0

methodAを呼び出すすべての呼び出しがreadLockのロックを解除する前の呼び出しを待つのではないでしょうか? – user2651804

+0

readLockは並列読み取りを許可します。 – AdamSkywalker

関連する問題