This is an automated email from the ASF dual-hosted git repository.

vy pushed a commit to branch recycler-api-3.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 6faaf2025e9eb036ff561aa2f21e37f7678d89aa
Author: Volkan Yazıcı <[email protected]>
AuthorDate: Wed Mar 29 14:52:45 2023 +0200

    Remove `ThreadLocal`s in `ParametrizedMessage`
---
 .../log4j/message/ParameterizedMessage.java        | 32 ++++++++++------------
 1 file changed, 15 insertions(+), 17 deletions(-)

diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
index 811d80f0e4..74879b89c8 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
@@ -19,7 +19,8 @@ package org.apache.logging.log4j.message;
 import java.util.Arrays;
 import java.util.Objects;
 
-import org.apache.logging.log4j.util.Constants;
+import org.apache.logging.log4j.spi.LoggingSystem;
+import org.apache.logging.log4j.spi.Recycler;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
 import org.apache.logging.log4j.util.StringBuilders;
 
@@ -67,8 +68,12 @@ public class ParameterizedMessage implements Message, 
StringBuilderFormattable {
 
     private static final int HASHVAL = 31;
 
-    // storing JDK classes in ThreadLocals does not cause memory leaks in web 
apps, so this is okay
-    private static final ThreadLocal<StringBuilder> threadLocalStringBuilder = 
new ThreadLocal<>();
+    private static final Recycler<StringBuilder> STRING_BUILDER_RECYCLER = 
LoggingSystem.getRecyclerFactory().create(
+            () -> new StringBuilder(DEFAULT_STRING_BUILDER_SIZE),
+            stringBuilder -> {
+                StringBuilders.trimToMaxSize(stringBuilder, 
DEFAULT_STRING_BUILDER_SIZE);
+                stringBuilder.setLength(0);
+            });
 
     private String messagePattern;
     private final Object[] argArray;
@@ -183,24 +188,17 @@ public class ParameterizedMessage implements Message, 
StringBuilderFormattable {
     @Override
     public String getFormattedMessage() {
         if (formattedMessage == null) {
-            final StringBuilder buffer = getThreadLocalStringBuilder();
-            formatTo(buffer);
-            formattedMessage = buffer.toString();
-            StringBuilders.trimToMaxSize(buffer, 
Constants.MAX_REUSABLE_MESSAGE_SIZE);
+            final StringBuilder buffer = STRING_BUILDER_RECYCLER.acquire();
+            try {
+                formatTo(buffer);
+                formattedMessage = buffer.toString();
+            } finally {
+                STRING_BUILDER_RECYCLER.release(buffer);
+            }
         }
         return formattedMessage;
     }
 
-    private static StringBuilder getThreadLocalStringBuilder() {
-        StringBuilder buffer = threadLocalStringBuilder.get();
-        if (buffer == null) {
-            buffer = new StringBuilder(DEFAULT_STRING_BUILDER_SIZE);
-            threadLocalStringBuilder.set(buffer);
-        }
-        buffer.setLength(0);
-        return buffer;
-    }
-
     @Override
     public void formatTo(final StringBuilder buffer) {
         if (formattedMessage != null) {

Reply via email to