2013-08-12 3 views
0

W.r.t ReadWriteLock, зачем мне блокировать, пока я просто что-то читаю? Блокировка в моих знаниях должна использоваться только в том случае, если я мутирую переменную, не читая ее, чтобы избежать параллельных потоков, пытающихся изменить эту переменную. Так почему нам нужен замок для чтения?Зачем нам нужен Java-замок для чтения?

ответ

4

Точка ReaderWriterLock заключается в том, чтобы убедиться, что ни одна другая нить не перепутала что-то во время ее чтения.

Часть считывания блокировки не является исключительной (могут быть несколько параллельных считывателей), за исключением части записи (читатели будут ждать записи и наоборот).

+1

Подробнее: Даже если ваш код читает только целое и не сложную структуру, вам нужны блокировки или атомы. Без них ваш поток не гарантирует когда-либо увидеть обновленное значение, потому что другие ЦП не обязаны выгружать его из кеша. Это не произойдет с правилами кэширования x86, но вы никогда не знаете, где будет работать ваш код. –

0

Некоторые виды объектов инкапсулируют несколько аспектов изменчивого состояния, которые, как ожидается, будут иметь какое-то отношение друг к другу. Например, List может иметь свойство Count, а также группу пронумерованных слотов. Предположим, что список начинается с 100 элементов, и поток пытается их перечислить. Примерно в то время, когда перечислимая нить достигает элемента 50, другой поток пытается вставить элемент до номера 25. Что должно произойти?

Если нумерационная нить приобретает токен блокировки чтения перед ее запуском и освобождает его, когда это делается, и поток, который хочет вставить элемент, сначала получает токен блокировки записи, тот факт, что нумерованный поток токен чтения-блокировки не позволит обновляющему потоку изменять список до тех пор, пока перечисление не будет завершено. Обратите внимание, что любое количество перечислимых потоков может работать одновременно без каких-либо конфликтов, но все они должны были бы завершить (освободить токены для чтения) до того, как в список могут быть внесены изменения. Обратите внимание, что после того, как был сделан запрос токена блокировки записи, запросы на токены для чтения будут отложены до тех пор, пока токен блокировки записи не будет выпущен и не выпущен; если это не было сделано, постоянный поток запросов на чтение может помешать любым запросам на запись получать их.

Смежные вопросы