Я программирую в java, и у меня есть List<LogEntry> log
, который делится между разными потоками.Многие писатели один читатель без параллелизма
Эти «писатели» потоки уже синхронизированы между ними, так что только один поток в момент времени может добавлять или удалять элементы из log
Однако, из-распределенного алгоритма, который я пытаюсь реализовать, там являются частью журнала, которые являются «безопасными», что означает, что они не могут быть изменены ни писателями, ни читателем (которые я введю ниже). Эта часть log
указывается полем int committedIndex
, которое инициализируется до 0 и монотонно возрастает.
В заключение авторы изменить элементы в log
в диапазоне (commitIndex,log.size())
, в то время как есть читатель, который получают элементы в log
, содержащихся в диапазоне [0,commitIndex]
. Читатель начинает читать с первой записи, затем читает следующую, пока не достигнет log.get(commitIndex)
, затем останавливается и уходит спать до commitIndex
. Он обновляет поле lastApplied
, которое инициализируется 0 и монотонно возрастает, чтобы запомнить последние logEntry
, которые он читал перед сном.
Как вы можете видеть, нет необходимости синхронизировать читателя и писателей, поскольку они имеют доступ к различным частям log
.
Вопрос: как я могу «проснуться» от читающей нити, когда увеличивается commitIndex
? Мне нужно что-то вроде этого (выполняемую писатель):
if(commitIndex is updated)
{
//wake up reader
}
и читатель:
public void run() {
while(true){
//go to sleeep...
//now the reader is awaken!
while(lastApplied<commitIndex){
//do something with log.get(lastApplied)
lastApplied++;
}
}
Очевидно, что я очень упрощена мой код для того, чтобы дать вам понять, что я хочу, как лучше, возможно, извините, если это недостаточно ясно (и не стесняйтесь спрашивать меня об этом). Благодаря!
Из [apidocs] (http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html): «Если несколько потоков обращаются к списку связанных/массивов одновременно, и по крайней мере один из потоков изменяет список структурно, он должен быть синхронизирован извне». Обратите внимание на акцент на _must_: ваше предположение о том, что чтение с более низкого индекса при записи на более высокий индекс является полным, неверно. – vanOekel
Список может быть изменен структурно только в разделе, который не используется Reader. Таким образом, нет никакого обмена между Reader и Writers, но только между Writers (которые действительно синхронизированы) – justHelloWorld