2012-04-10 10 views
2

アクセス権を同期したいリソースがあるとします。これらのアクセスのほとんどは読み取り専用です。私はシステムが扱うことができるように一度に多くの読み取り専用アクセスを許可したいと思います。しかし、私は読書を止め、書いて、読書をもう一度できるようにしたいと思います。 java.util.concurrentクラスを使用すると、読み書きを整理できますか?

だから、読み取りスレッドが任意の数のスレッドが同時にこれを行うことができます。この

Resource r = null; 
readLock.acquire(); 
r = resources.get(); 
readLock.release(); 

のように見えるかもしれませんが、それは問題ではないでしょう。

書き込みスレッドは、次のようになります。

readLock.acquireOnlyMe(); // waits for all other threads to relase 
          // all other threads block when they try to acquire 
r = resources.get(); 
r.setData(data); 
readLock.release(); 

今、私は読み取りと書き込みの両方として機能 ReentrantLockを使用しています。しかし、明らかに、これは読んで、私がむしろ同時に作業したい時には、順番に働くようにしています。

この問題を解決するにはどうすればよいですか?

これはknown as the readers-writers problemであり、wikiエントリにはいくつかのC実装がリストされていますが、Javaでは何も表示されていません。

編集:私はジョブを完了する任意のJavaライブラリにオープンしています。タイトルがjava.util.concurrentと表示されるのは、その答えがそこにある可能性が高いからです。

+1

私は[this](http://stackoverflow.com/a/6089967/248082)と答えていると思います。 – nobeh

+0

"WikiエントリにはいくつかのC実装が列挙されていますが、Javaのためのものはありません" - Java 5で紹介されたReadWriteLockについてはどうでしょうか? – yshavit

+0

これはまさに私が探しているようです。私はそこにサブパッケージがあることを認識しませんでした。優れた! – corsiKa

答えて

2

ライタースレッドを1つに制限する場合は、ReentrantReadWriteLockを使用します。

複数の場合、おそらく、セマフォを使用してライターをロックしたいと思うかもしれません。最初の許可数をコアの数(おそらくコア+ 1)に基づいて設定することをお勧めします。

関連する問題