TGViewer
Spring АйО Spring АйО @spring_aio · 11K subscribers
Post #146 3.29K
🖥 Scoped Values в Java (Часть 2)

Недавно мы рассказывали про Scoped Values. Одной из ключевых особенностей Scoped Values (JEP-481) является отсутствие метода set, в отличие от ThreadLocal, что позволяет гарантировать, что после привязки значения к run/call методам конкретных Runnable и Callable, оно не может быть в них изменено:


private static final ScopedValue<String> X = ScopedValue.newInstance();

void foo() {
ScopedValue.runWhere(X, "hello", () -> bar()); //привязываем значение "hello" для метода bar()
}

void bar() {
System.out.println(X.get()); // "hello"
ScopedValue.runWhere(X, "goodbye", () -> baz()); //привязываем значение "goodbye" для метода baz()
System.out.println(X.get()); // "hello"
}

void baz() {
System.out.println(X.get()); // "goodbye"
}


1. В методе foo() устанавливаем значение "hello" для области видимости внутри метода bar()
2. В методе bar() запрашиваем значение. Получаем "hello"
3. В методе bar() устанавливаем значение "goodbye" для области видимости внутри метода baz()
4. В методе bar() запрашиваем значение. Получаем "hello". Тем самым убеждаемся, что после установки значения для области видимости внутри метода baz() оно не поменялось для метода bar()
5. В методе baz() запрашиваем значение. Получаем "goodbye".

Важно отметить, что привязка "goodbye" действует только внутри вложенной области видимости. После завершения выполнения метода baz() значение X в bar() возвращается к "hello". Таким образом, тело метода bar() не может изменить привязку, видимую этим методом, но может изменить привязку, видимую его вызываемыми методами. После завершения метода foo() X возвращается в состояние без привязки. Такое вложение гарантирует ограниченный срок действия для совместного использования нового значения.

Scoped Values API также предоставляет метод callWhere, который позволяет получить результат выполнения:


var result = ScopedValue.callWhere(X, "hello", () -> bar());


В этом случае callWhere выполняет код внутри области видимости, где X привязан к значению "hello", и возвращает результат выполнения.

Подводя итог, складывается ощущение, что нововведение предоставляет более безопасный и эффективный способ передачи данных между потоками по сравнению с использованием ThreadLocal. Однако с уверенностью можно будет об этом говорить только после того, как фича выйдет из preview и войдет в состав языка на постоянной основе.

Ставьте 🔥 если разбор JEP был полезен и вы хотели бы видеть больше подобных обзоров

#Java #JEP
  • 🔥 36
  • ❤ 4
  • 👍 4
More from @spring_aio
  1. Oct 16, 2026😀 Joker 2026 && Spring АйО 🍃 Два дня в Петербурге пролетели быстрее, чем прогрев JVM. До…
  2. Oct 11, 2026🎬 Записи докладов с JPoint 2026 уже в открытом доступе JUG Ru Group выложили записи с про…
  3. Oct 9, 2026👩‍💻 Kotlin получил почти настоящие статики Начиная с Kotlin 2.5.0-Beta1 можно эксперимен…
  4. Oct 8, 2026🍃 Spring Boot ломает совместимость, G1 тормозит микросервисы, Java долго релизит фичи | S…
  5. Oct 6, 2026👩‍💻 Spring Config Import без магии У наших друзей из Axelix вышла статья о том, как Spri…
  6. Oct 5, 2026🥲 В Java 27 TLS научился переживать квантовую атаку При установке HTTPS-соединения клиент…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →