[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-chto-takoe-readwritelock":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":20,"progress":21,"seo":22},276,"chto-takoe-readwritelock",8,"mnogopotochnost","Многопоточность","🔀","Что такое ReadWriteLock?","\u003C!-- grade: 3\u002F5 — слишком краткий ответ; добавлены подробности, ограничения и сценарии -->\n\n`ReadWriteLock` — это интерфейс из пакета `java.util.concurrent.locks`, который оперирует **парой связанных блокировок**: одна для операций чтения, другая — для записи.\n\n**Основная идея:** несколько потоков могут одновременно читать общий ресурс (shared lock), но запись требует эксклюзивного доступа (exclusive lock). Пока хотя бы один поток удерживает блокировку записи, ни один поток не может получить ни блокировку чтения, ни блокировку записи.\n\n**Реализация — `ReentrantReadWriteLock`:**\n\n```java\nReadWriteLock rwLock = new ReentrantReadWriteLock();\nLock readLock = rwLock.readLock();\nLock writeLock = rwLock.writeLock();\n\n\u002F\u002F Чтение — множество потоков одновременно\nreadLock.lock();\ntry {\n    return cache.get(key); \u002F\u002F shared reading\n} finally {\n    readLock.unlock();\n}\n\n\u002F\u002F Запись — эксклюзивный доступ\nwriteLock.lock();\ntry {\n    cache.put(key, value); \u002F\u002F exclusive write\n} finally {\n    writeLock.unlock();\n}\n```\n\n**Характеристики `ReentrantReadWriteLock`:**\n\n| Свойство | Значение |\n|---|---|\n| Максимум блокировок чтения | 65 535 |\n| Максимум блокировок записи | 65 535 |\n| Реентрабельность | Да, для обоих видов |\n| Fairness | Настраивается (`new ReentrantReadWriteLock(true)`) |\n| Понижение блокировки (write → read) | Да (захватить readLock, затем отпустить writeLock) |\n| Повышение блокировки (read → write) | **Нет** (приведёт к deadlock) |\n\n**Понижение блокировки (lock downgrading):**\n\n```java\nwriteLock.lock();\ntry {\n    updateData();\n    readLock.lock(); \u002F\u002F Захватываем readLock, пока держим writeLock\n} finally {\n    writeLock.unlock(); \u002F\u002F Отпускаем writeLock — теперь только readLock\n}\ntry {\n    return readData(); \u002F\u002F Продолжаем читать под readLock\n} finally {\n    readLock.unlock();\n}\n```\n\n**Когда использовать:**\n- Сценарии с **преобладанием чтений** над записями (кэши, конфигурации, справочники).\n- Если записи преобладают или равны чтениям, `ReentrantReadWriteLock` не даст преимущества — используйте обычный `ReentrantLock`.\n- Для ещё большей производительности при чтении рассмотрите `StampedLock` с оптимистичным чтением (см. соответствующий вопрос).\n\n> **Аналогия:** ReadWriteLock — это правила библиотеки. Читать книгу могут несколько человек одновременно (они не мешают друг другу), но чтобы внести правку в книгу, нужно забрать её у всех читателей и работать в одиночку.\n\n> **На собеседовании** могут спросить: «Можно ли повысить readLock до writeLock?» Ответ: нет, нельзя — это приведёт к deadlock, потому что поток будет ждать освобождения readLock, который он сам удерживает. Для такого сценария используйте `StampedLock.tryConvertToWriteLock()`.","","middle",[15,16,17,18,19],"ReadWriteLock","блокировки","ReentrantReadWriteLock","чтение-запись","concurrency",[],null,{"title":23,"description":24,"ogTitle":25,"ogDescription":26,"keywords":27,"schemaAnswer":32,"featuredSnippetReady":33},"Что такое ReadWriteLock в Java — блокировка чтения и записи — Gymterview","ReadWriteLock оперирует парой блокировок: для чтения (разделяемая) и для записи (эксклюзивная). Реализация ReentrantReadWriteLock поддерживает до 65535 блокировок.","ReadWriteLock в Java — разделяемая и эксклюзивная блокировка","ReadWriteLock позволяет нескольким потокам читать одновременно, блокируя доступ только при записи. Реализация — ReentrantReadWriteLock.",[28,17,29,30,31],"ReadWriteLock Java","блокировка чтения записи","read write lock","многопоточность","ReadWriteLock — интерфейс, расширяющий базовый Lock. Оперирует парой связанных блокировок: для чтения и для записи. Блокировка чтения может удерживаться несколькими потоками одновременно, пока нет записывающего потока. Блокировка записи эксклюзивна. Реализация ReentrantReadWriteLock поддерживает до 65535 блокировок каждого типа.",true]