В вашей нити производителя вы, скорее всего, будете иметь какой-то основной цикл. Это, вероятно, лучшее место для прерывания вашего продюсера. Вместо того, чтобы использовать ожидание() и уведомить() я предлагаю вам использовать объекты Java синхронизации, введенные в Java 5.
Вы могли бы потенциально сделать что-то подобное
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();
}
}
}
Вы должны убедиться, что каждый раз, indexer освобождает блокировку, ваш индекс находится в согласованном, законном состоянии. В этом случае, когда индексатор освобождает блокировку, он оставляет шанс для новой или ожидающей операции lookup(), чтобы выполнить блокировку, завершить и освободить блокировку, после чего ваш индексист может перейти к следующему шагу.Если lookup() в настоящее время не ждет, то ваш индексист просто запустит сам замок и продолжит свою следующую операцию.
Если вы считаете, что у вас может быть больше одного потока, пытающегося выполнить поиск в одно и то же время, возможно, вам стоит взглянуть на интерфейс ReadWriteLock и реализацию ReentrantReadWriteLock.
Конечно, это решение - простой способ сделать это. Он заблокирует ни один из потоков, который не имеет блокировки. Вы можете проверить, можете ли вы просто синхронизировать свою структуру данных напрямую, но это может показаться сложным, поскольку индексы зданий имеют тенденцию использовать какое-то сбалансированное дерево или B-Tree или еще что-то, где вставка узла далека от тривиальной.
Предлагаю вам сначала попробовать этот простой подход, а затем посмотреть, подходит ли он для вас. Если это не так, вы можете попытаться разбить шаги индексации на более мелкие шаги или попробовать синхронизировать только части вашей структуры данных.
Не беспокойтесь о производительности блокировки, в незащищенной блокировке java (когда только один поток пытается захватить замок) дешево. До тех пор, пока большая часть вашей блокировки не имеет значения, производительность блокировки не вызывает беспокойства.
Вы предлагаете нечто вроде блокировки строк в базах данных. В настоящее время дерево заблокировано, чтобы пропускать один поток. –