プロデューサスレッドでは、何らかのメインループが発生する可能性があります。これはおそらくあなたのプロデューサーを中断させるのに最適な場所です。代わりに、待機()と私はあなたが潜在的にあなたは必ずその都度確認する必要があり、その
class Indexer {
Lock lock = new ReentrantLock();
public void index(){
while(somecondition){
this.lock.lock();
try{
// perform one indexing step
}finally{
lock.unlock();
}
}
}
public Item lookup(){
this.lock.lock();
try{
// perform your lookup
}finally{
lock.unlock();
}
}
}
ような何かを行うことができ5.
あなたはJavaで導入されたJava同期オブジェクトを使用することをお勧め)(通知を使用しますインデクサーがロックを解除すると、インデックスは一貫した法的状態になります。このシナリオでは、インデクサーがロックを解除すると、新規または待機中のlookup()操作によってロックが取得され、ロックが完了して解放されます。その時点で、インデクサーは次の手順に進むことができます。lookup()が現在待機していない場合、インデクサはロック自体を再取得し、次の操作を続行します。
複数のスレッドが同時に検索を実行しようとしていると思われる場合は、ReadWriteLockインターフェイスとReentrantReadWriteLockの実装を調べることをお勧めします。
もちろん、このソリューションは簡単な方法です。ロックされていないスレッドのいずれかがブロックされます。あなたのデータ構造を直接同期することができるかどうかチェックしたいかもしれませんが、ビルド・インデックスはバランスのとれたツリーやB-Treeなどのノードを使用する傾向があるので、難しいかもしれません。
まず、簡単な方法を試してから、それがあなたに合った動作をするかどうかを確認することをお勧めします。そうでない場合は、索引付けステップを小さなステップに分割してみるか、データ構造の一部でのみ同期を試みてください。
ロックのパフォーマンスについてあまり気にしないでください。ロックされていないロック(ロックを取ろうとするスレッドが1つだけの場合)は安いです。あなたのロックの大部分が不一致である限り、ロックのパフォーマンスは心配するものではありません。
データベースの行ロックに似た何かを提案しています。現在、ツリーは、1つのスレッドが通過できるようにロックされています。 –