W.r.t ReadWriteLock, зачем мне блокировать, пока я просто что-то читаю? Блокировка в моих знаниях должна использоваться только в том случае, если я мутирую переменную, не читая ее, чтобы избежать параллельных потоков, пытающихся изменить эту переменную. Так почему нам нужен замок для чтения?Зачем нам нужен Java-замок для чтения?
ответ
Точка ReaderWriterLock заключается в том, чтобы убедиться, что ни одна другая нить не перепутала что-то во время ее чтения.
Часть считывания блокировки не является исключительной (могут быть несколько параллельных считывателей), за исключением части записи (читатели будут ждать записи и наоборот).
Некоторые виды объектов инкапсулируют несколько аспектов изменчивого состояния, которые, как ожидается, будут иметь какое-то отношение друг к другу. Например, List
может иметь свойство Count
, а также группу пронумерованных слотов. Предположим, что список начинается с 100 элементов, и поток пытается их перечислить. Примерно в то время, когда перечислимая нить достигает элемента 50, другой поток пытается вставить элемент до номера 25. Что должно произойти?
Если нумерационная нить приобретает токен блокировки чтения перед ее запуском и освобождает его, когда это делается, и поток, который хочет вставить элемент, сначала получает токен блокировки записи, тот факт, что нумерованный поток токен чтения-блокировки не позволит обновляющему потоку изменять список до тех пор, пока перечисление не будет завершено. Обратите внимание, что любое количество перечислимых потоков может работать одновременно без каких-либо конфликтов, но все они должны были бы завершить (освободить токены для чтения) до того, как в список могут быть внесены изменения. Обратите внимание, что после того, как был сделан запрос токена блокировки записи, запросы на токены для чтения будут отложены до тех пор, пока токен блокировки записи не будет выпущен и не выпущен; если это не было сделано, постоянный поток запросов на чтение может помешать любым запросам на запись получать их.
- 1. Зачем нам нужен org.junit.ComparisonFailure?
- 2. Зачем нам нужен cmake?
- 3. Зачем нам нужен contexClassLoader
- 4. Зачем нам нужен enabled_shared_from_this
- 5. Зачем нам нужен Control.Lens.Reified?
- 6. Зачем нам нужен mktemp?
- 7. Зачем нам нужен strdup()?
- 8. Зачем нам нужен кеш?
- 9. Зачем нам нужен конструктор?
- 10. Зачем нам нужен @GeneratedValue?
- 11. Зачем нам нужен IIS Express?
- 12. Зачем нам нужен сгенерированный код?
- 13. Зачем нам нужен обратный адрес?
- 14. Зачем нам нужен новый оператор?
- 15. Зачем нам нужен частный конструктор?
- 16. Зачем нам нужен сервер Fuseki?
- 17. Зачем нам нужен длинный тип?
- 18. Зачем нам нужен оператор «delete []»?
- 19. Зачем нам нужен полукруглый разъем?
- 20. Зачем нам нужен двумерный массив?
- 21. Зачем нам нужен TensorFlow tf.Graph?
- 22. Зачем нам нужен request.getSession (true)?
- 23. Зачем нам нужен компилятор C++?
- 24. Зачем нам нужен частный конструктор?
- 25. Зачем нам нужен SocketOptions.SO_BROADCAST для включения трансляции?
- 26. Зачем нам нужен CNN для обнаружения объекта?
- 27. Зачем нам нужен замок для реентерабера?
- 28. Зачем нам нужен шаблон для заводских образцов?
- 29. Зачем нам нужен javaScript-исполнитель для webdriver?
- 30. Зачем нам нужен io_service в boost?
Подробнее: Даже если ваш код читает только целое и не сложную структуру, вам нужны блокировки или атомы. Без них ваш поток не гарантирует когда-либо увидеть обновленное значение, потому что другие ЦП не обязаны выгружать его из кеша. Это не произойдет с правилами кэширования x86, но вы никогда не знаете, где будет работать ваш код. –