From 61ef5a89304054f0339c7fc81ba9789ed7fe7929 Mon Sep 17 00:00:00 2001 From: Seungrae Date: Thu, 23 May 2024 02:00:47 +0900 Subject: [PATCH 1/2] Document using ThreadLocal#remove instead of ThreadLocal#set(null) See gh-32874 --- .../modules/ROOT/pages/core/aop-api/targetsource.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework-docs/modules/ROOT/pages/core/aop-api/targetsource.adoc b/framework-docs/modules/ROOT/pages/core/aop-api/targetsource.adoc index 5fd0299a4d0..71cb2799757 100644 --- a/framework-docs/modules/ROOT/pages/core/aop-api/targetsource.adoc +++ b/framework-docs/modules/ROOT/pages/core/aop-api/targetsource.adoc @@ -222,7 +222,7 @@ incorrectly using them in multi-threaded and multi-classloader environments. You should always consider wrapping a `ThreadLocal` in some other class and never directly use the `ThreadLocal` itself (except in the wrapper class). Also, you should always remember to correctly set and unset (where the latter simply involves a call to -`ThreadLocal.set(null)`) the resource local to the thread. Unsetting should be done in +`ThreadLocal.remove()`) the resource local to the thread. Unsetting should be done in any case, since not unsetting it might result in problematic behavior. Spring's `ThreadLocal` support does this for you and should always be considered in favor of using `ThreadLocal` instances without other proper handling code. From c01aab58502803ed4a12a360ef8f9ffa140dbb91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 23 May 2024 08:12:14 +0200 Subject: [PATCH 2/2] Polish See gh-32874 --- .../modules/ROOT/pages/core/aop-api/targetsource.adoc | 2 +- .../jdbc/datasource/lookup/AbstractRoutingDataSourceTests.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework-docs/modules/ROOT/pages/core/aop-api/targetsource.adoc b/framework-docs/modules/ROOT/pages/core/aop-api/targetsource.adoc index 71cb2799757..5b891654715 100644 --- a/framework-docs/modules/ROOT/pages/core/aop-api/targetsource.adoc +++ b/framework-docs/modules/ROOT/pages/core/aop-api/targetsource.adoc @@ -221,7 +221,7 @@ NOTE: `ThreadLocal` instances come with serious issues (potentially resulting in incorrectly using them in multi-threaded and multi-classloader environments. You should always consider wrapping a `ThreadLocal` in some other class and never directly use the `ThreadLocal` itself (except in the wrapper class). Also, you should -always remember to correctly set and unset (where the latter simply involves a call to +always remember to correctly set and unset (where the latter involves a call to `ThreadLocal.remove()`) the resource local to the thread. Unsetting should be done in any case, since not unsetting it might result in problematic behavior. Spring's `ThreadLocal` support does this for you and should always be considered in favor of using diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSourceTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSourceTests.java index e639f287d1c..0aa39c18c5b 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSourceTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSourceTests.java @@ -135,7 +135,7 @@ class AbstractRoutingDataSourceTests { routingDataSource.setDefaultTargetDataSource(ds); routingDataSource.setLenientFallback(false); routingDataSource.afterPropertiesSet(); - lookupKey.set(null); + lookupKey.remove(); assertThat(routingDataSource.determineTargetDataSource()).isSameAs(ds); }