Java: VarHandle можно использовать как более лёгкую альтернативу volatile. Это строго типизированная ссылка на переменную.
Когда две нити работают с одной и той же переменной, процессор может переупорядочивать операции и кэшировать записи. В результате одна нить обновляет значение, а другая продолжает видеть его старую версию.
#JavaDev
✅
✅
Это похоже на нажатие кнопки «Сохранить и опубликовать» для поста.
✅
Она означает: «Дай мне опубликованное значение, и вместе с ним я корректно увижу всё, что было записано до его публикации».
✅
Это обеспечивает необходимую видимость данных между потоками без полной стоимости синхронизации, которую обычно накладывает
✅
Главное:
Демо на GitHub: https://github.com/mcasari/codingstrain/tree/main/x-posts-examples/java-varhandle-fences-demo
👉 Java Portal
Когда две нити работают с одной и той же переменной, процессор может переупорядочивать операции и кэшировать записи. В результате одна нить обновляет значение, а другая продолжает видеть его старую версию.
#JavaDev
✅
volatile решает эту проблему, обеспечивая полную синхронизацию каждой операции чтения и записи. Это безопасно, но довольно затратно: такой уровень гарантий часто оказывается избыточным и медленнее, чем требуется на практике.VarHandle предоставляет более гибкий и лёгкий механизм благодаря набору специализированных методов.✅
setRelease — это операция «публикации» значения. Поток-записыватель говорит: «Я закончил. Всё, что я записал до этого момента, теперь безопасно для чтения другими потоками».Это похоже на нажатие кнопки «Сохранить и опубликовать» для поста.
✅
getAcquire — это операция «подписки» на опубликованные данные.Она означает: «Дай мне опубликованное значение, и вместе с ним я корректно увижу всё, что было записано до его публикации».
✅
setRelease и getAcquire работают в паре: если поток-читатель увидел флаг, записанный через setRelease, то он гарантированно увидит и все данные, которые были записаны до установки этого флага.Это обеспечивает необходимую видимость данных между потоками без полной стоимости синхронизации, которую обычно накладывает
volatile.✅
setOpaque — самый дешёвый вариант. Подходит для сценариев с одним потоком-записывателем, когда нужно лишь сохранить порядок собственных операций записи без дополнительных гарантий синхронизации между потоками.Главное:
volatile предоставляет все эти гарантии сразу, но за более высокую цену. VarHandle позволяет выбрать только те гарантии видимости и упорядочивания памяти, которые действительно нужны в конкретном случае.Демо на GitHub: https://github.com/mcasari/codingstrain/tree/main/x-posts-examples/java-varhandle-fences-demo
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Java: избегайте магических чисел.
В Java магическим числом (Magic Number) называют жёстко заданное числовое значение, используемое в коде без какого-либо пояснения того, что именно оно обозначает.
Магические числа снижают читаемость кода и усложняют его сопровождение.
#JavaDev #CleanCode
👉 Java Portal
В Java магическим числом (Magic Number) называют жёстко заданное числовое значение, используемое в коде без какого-либо пояснения того, что именно оно обозначает.
Магические числа снижают читаемость кода и усложняют его сопровождение.
#JavaDev #CleanCode
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3
Java: По возможности не возвращайте из методов изменяемые внутренние коллекции, чтобы:
Не раскрывать внутреннее состояние объекта, повышая безопасность.
Иметь возможность менять реализацию без риска сломать другие части приложения.
#Java #JavaDev
👉 Java Portal
Не раскрывать внутреннее состояние объекта, повышая безопасность.
Иметь возможность менять реализацию без риска сломать другие части приложения.
#Java #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6