Из документации не ясно, что происходит с потоками чтения и записи, если попытка записи происходит во время удержания readLock.
Я говорю об этом времени:
- Поток читателей (или некоторые потоки читателей) приходит и получает блокировку чтения с намерением вызвать некоторые геттеры для какого-либо многопольного объекта
- В середине роя геттеров приходит поток Writer, требующий writeLock, и намереваетсязначительно изменить состояние объекта
- Кроме того, все больше читателей приходят с намерением получить блокировку чтения и вызвать всех получателей
Итак, вопросы:
- ( кажется, что да ) Поток писателя ждет, пока все читатели из группы 1 вызовут unlockRead (stamp) ? Таким образом, каждый читатель гарантированно видит непротиворечивое состояние, удерживая readLock (в отличие от tryOptimisticRead -> указано, что несоответствия могут возникать, если приходит писатель)?
Я провел тест с 19 читателями и 1 писателем, и почти каждый раз, когда получалось, что выполняемый поток писателей некоторое время ждал, прежде чем приступить к фиктивной работе. Код писателей приведен ниже, код читателя очень похож.
// lock is a shared StampedLock
// state is an AtomicBoolean that readers tried to 'dirty read'
def start = currentTimeMillis()
def stamp = lock.writeLock()
try {
state.set(!state.get())
def sleepTime = ThreadLocalRandom.current().nextInt(100,200)
sleep(sleepTime)
println("WRITER: I waited for ${currentTimeMillis() - start - sleepTime} ms and worked for ${sleepTime}")
} finally {
lock.unlock(stamp)
}
- (, конечно, да, но все же с упоминанием ) все читатели из группы 3 будут ждать, пока писатель разблокируетWrite(штамп)?
Итак, вызов unlockRead (...) имеет два намерения: защищает от взаимоблокировки в одном потоке и позволяет авторам получить эксклюзивную блокировку записи?
Обновление: вот видео на ReadWriteLock - логика очень похожа на stampedlock