In Ihrem Producer-Thread haben Sie wahrscheinlich eine Art Hauptschleife. Dies ist wahrscheinlich der beste Ort, um Ihren Produzenten zu unterbrechen. Statt Warte mit() und notify() Ich schlage vor, Sie in Java eingeführt Synchronisationsobjekte java verwenden 5.
Sie möglicherweise etwas wie das
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();
}
}
}
Sie müssen
tun könnte, um sicherzustellen, dass jedes Mal, wenn die Indexer gibt die Sperre frei, Ihr Index befindet sich in einem konsistenten, legalen Status. Wenn der Indexer in diesem Szenario die Sperre freigibt, bleibt eine neue oder wartende lookup() -Operation übrig, um die Sperre zu übernehmen, abzuschließen und die Sperre aufzuheben. Anschließend kann der Indexer mit dem nächsten Schritt fortfahren.Wenn derzeit kein lookup() wartet, greift Ihr Indexer nur auf die Sperre selbst zu und geht mit der nächsten Operation weiter.
Wenn Sie der Meinung sind, dass mehr als ein Thread versucht, die Suche gleichzeitig durchzuführen, sollten Sie sich die ReadWriteLock-Schnittstelle und die ReentrantReadWriteLock-Implementierung ansehen.
Natürlich ist diese Lösung der einfache Weg, es zu tun. Es wird einen der Threads blockieren, die nicht über die Sperre verfügen. Vielleicht möchten Sie überprüfen, ob Sie Ihre Datenstruktur direkt synchronisieren können, aber das könnte sich als schwierig erweisen, da der Aufbau von Indizes dazu neigt, eine Art ausgeglichener Baum oder B-Baum zu verwenden oder wo die Knoteneinfügung bei weitem nicht trivial ist.
Ich schlage vor, dass Sie zuerst diesen einfachen Ansatz versuchen, dann sehen, ob die Art, wie es sich verhält, Ihnen passt. Wenn dies nicht der Fall ist, versuchen Sie entweder, die Indexierungsschritte in kleinere Schritte aufzuteilen oder versuchen Sie, nur Teile Ihrer Datenstruktur zu synchronisieren.
Mach dir keine Sorgen über die Leistung der Sperrung, in Java unüberlegtes Sperren (wenn nur ein Thread versucht, die Sperre zu nehmen) ist billig. Solange der Großteil Ihrer Sperrung nicht gesichert ist, ist die Sperrperformance unbedenklich.
Sie schlagen etwas vor, das dem Zeilensperren in Datenbanken ähnlich ist. Derzeit ist der Baum gesperrt, damit ein Thread durchlaufen werden kann. –