[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-chto-takoe-stampedlock-i-chem-on-otlichaetsya-ot-reentrantreadwritelock":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},300,"chto-takoe-stampedlock-i-chem-on-otlichaetsya-ot-reentrantreadwritelock",8,"mnogopotochnost","Многопоточность","🔀","Что такое StampedLock и чем он отличается от ReentrantReadWriteLock?","\u003C!-- grade: 5\u002F5 — подробный ответ с примером оптимистичного чтения -->\n\n`StampedLock` — это блокировка из Java 8, которая поддерживает три режима доступа: **запись**, **чтение** и **оптимистичное чтение**. Обеспечивает более высокую производительность по сравнению с `ReentrantReadWriteLock` при преобладании операций чтения.\n\n**Три режима:**\n\n1. **Запись (write lock)** — эксклюзивная блокировка.\n2. **Чтение (read lock)** — разделяемая блокировка.\n3. **Оптимистичное чтение (optimistic read)** — неблокирующее. Возвращается «штамп» (stamp), который проверяется на валидность. Если за время чтения произошла запись — штамп невалиден, нужно повторить чтение.\n\n\u003Cdetails>\n\u003Csummary>Код: StampedLock с оптимистичным чтением\u003C\u002Fsummary>\n\n```java\nclass Point {\n    private double x, y;\n    private final StampedLock lock = new StampedLock();\n\n    \u002F\u002F Запись\n    void move(double deltaX, double deltaY) {\n        long stamp = lock.writeLock();\n        try {\n            x += deltaX;\n            y += deltaY;\n        } finally {\n            lock.unlockWrite(stamp);\n        }\n    }\n\n    \u002F\u002F Оптимистичное чтение — самый производительный способ\n    double distanceFromOrigin() {\n        long stamp = lock.tryOptimisticRead(); \u002F\u002F Не блокирует!\n        double currentX = x, currentY = y;     \u002F\u002F Читаем данные\n\n        if (!lock.validate(stamp)) {           \u002F\u002F Проверяем: была ли запись?\n            \u002F\u002F Если была — переходим к пессимистичному чтению\n            stamp = lock.readLock();\n            try {\n                currentX = x;\n                currentY = y;\n            } finally {\n                lock.unlockRead(stamp);\n            }\n        }\n        return Math.sqrt(currentX * currentX + currentY * currentY);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n**Сравнение с `ReentrantReadWriteLock`:**\n\n| Характеристика | `ReentrantReadWriteLock` | `StampedLock` |\n|---|---|---|\n| Оптимистичное чтение | Нет | Да |\n| Реентрабельность | Да | **Нет** |\n| Условия (`Condition`) | Да | Нет |\n| Fairness policy | Да | Нет |\n| Конвертация блокировок | Нет | Да (read -> write, optimistic -> read) |\n| Производительность чтения | Хорошая | Отличная (с optimistic read) |\n\n**Конвертация блокировок:**\n\n\u003Cdetails>\n\u003Csummary>Код: повышение блокировки чтения до записи\u003C\u002Fsummary>\n\n```java\nlong stamp = lock.readLock();\ntry {\n    while (x == 0.0) {\n        long writeStamp = lock.tryConvertToWriteLock(stamp);\n        if (writeStamp != 0L) {\n            stamp = writeStamp;\n            x = 1.0;\n            break;\n        } else {\n            lock.unlockRead(stamp);\n            stamp = lock.writeLock();\n        }\n    }\n} finally {\n    lock.unlock(stamp);\n}\n```\n\n\u003C\u002Fdetails>\n\n**Ключевые особенности:**\n- **Не реентрабелен** — повторный захват из того же потока приведёт к deadlock.\n- Оптимистичное чтение — это не блокировка, а «снимок» состояния. Валидация обязательна.\n- Не реализует интерфейс `Lock` — собственный API на основе штампов (`long stamp`).\n- Лучше всего подходит для коротких критических секций с преобладанием чтения.\n\n**Частые ошибки:**\n- Забытый `finally` — штамп нужно передавать при `unlock`, без `finally` — вечная блокировка.\n- Оптимистичное чтение для длинных операций — частые повторения могут быть дороже обычной блокировки.\n- Реентрабельный захват — deadlock без явной ошибки.\n- Неверный штамп в `unlock` — `IllegalMonitorStateException`.\n\n> **Аналогия:** `StampedLock` с оптимистичным чтением — это как чтение расписания на вокзале. Вы подходите, читаете время (optimistic read), а затем проверяете, не перевернулся ли табло (validate). Если перевернулось — читаете заново. Если нет — используете данные. Это быстрее, чем ждать в очереди у окошка кассы (pessimistic read lock).\n\n> **На собеседовании** ключевой вопрос: «Когда `StampedLock` лучше `ReentrantReadWriteLock`?» Ответ: когда соотношение чтений к записям высокое (>10:1) и критические секции короткие. Главное ограничение — отсутствие реентрабельности.","","senior",[15,16,17,18,19],"оптимистичное-чтение","StampedLock","блокировки","ReentrantReadWriteLock","concurrency",[],null,{"title":23,"description":24,"ogTitle":25,"ogDescription":26,"keywords":27,"schemaAnswer":33,"featuredSnippetReady":34},"StampedLock vs ReentrantReadWriteLock в Java — оптимистичное чтение — Gymterview","StampedLock (Java 8) поддерживает три режима: запись, чтение и оптимистичное чтение. Не реентрабелен, но быстрее при преобладании чтений.","StampedLock — оптимистичное чтение и конвертация блокировок","StampedLock поддерживает оптимистичное чтение (без блокировки), конвертацию read->write. Не реентрабелен, без Condition и fairness.",[28,29,30,31,32],"StampedLock Java","StampedLock vs ReentrantReadWriteLock","оптимистичное чтение","tryOptimisticRead","штампованная блокировка","StampedLock (Java 8) поддерживает три режима: запись (эксклюзивная), чтение (разделяемая) и оптимистичное чтение (неблокирующее — возвращает штамп для последующей валидации). Отличия от ReentrantReadWriteLock: есть оптимистичное чтение, но нет реентрабельности, нет Condition, нет fairness policy. Поддерживает конвертацию блокировок (read -> write). Лучше для структур с преобладанием чтения.",true]