Skip to content

Commit 47d8618

Browse files
committed
Replace synchronized with locks in JTL (#2725)
1 parent fb9b626 commit 47d8618

File tree

2 files changed

+59
-9
lines changed

2 files changed

+59
-9
lines changed

log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutNullEventDelimiterTest.java

+33-7
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import java.net.ServerSocket;
2626
import java.net.Socket;
2727
import java.util.concurrent.TimeUnit;
28+
import java.util.concurrent.locks.Lock;
29+
import java.util.concurrent.locks.ReentrantLock;
2830
import org.apache.commons.codec.binary.Hex;
2931
import org.apache.logging.log4j.Level;
3032
import org.apache.logging.log4j.Logger;
@@ -108,11 +110,13 @@ public Result filter(LogEvent event) {
108110

109111
private static final class TcpServer extends Thread implements AutoCloseable {
110112

113+
private final Lock lock = new ReentrantLock();
114+
111115
private final ServerSocket serverSocket;
112116

113117
private final ByteArrayOutputStream outputStream;
114118

115-
private volatile int totalReadByteCount = 0;
119+
private int totalReadByteCount = 0;
116120

117121
private volatile boolean closed = false;
118122

@@ -136,9 +140,12 @@ public void run() {
136140
final int readByteCount = inputStream.read(buffer);
137141
if (readByteCount != -1) {
138142
LOGGER.info("Received bytes {}.", () -> Hex.encodeHex(buffer, 0, readByteCount, false));
139-
synchronized (this) {
143+
lock.lock();
144+
try {
140145
totalReadByteCount += readByteCount;
141146
outputStream.write(buffer, 0, readByteCount);
147+
} finally {
148+
lock.unlock();
142149
}
143150
} else {
144151
break;
@@ -159,16 +166,35 @@ public int getPort() {
159166
return serverSocket.getLocalPort();
160167
}
161168

162-
public synchronized byte[] getReceivedBytes() {
163-
return outputStream.toByteArray();
169+
public byte[] getReceivedBytes() {
170+
lock.lock();
171+
try {
172+
return outputStream.toByteArray();
173+
} finally {
174+
lock.unlock();
175+
}
164176
}
165177

166-
public synchronized int getTotalReadByteCount() {
167-
return totalReadByteCount;
178+
public int getTotalReadByteCount() {
179+
lock.lock();
180+
try {
181+
return totalReadByteCount;
182+
} finally {
183+
lock.unlock();
184+
}
168185
}
169186

170187
@Override
171-
public synchronized void close() {
188+
public void close() {
189+
lock.lock();
190+
try {
191+
unsynchronizedClose();
192+
} finally {
193+
lock.unlock();
194+
}
195+
}
196+
197+
private void unsynchronizedClose() {
172198
if (closed) {
173199
throw new IllegalStateException("shutdown has already been invoked");
174200
}

log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TimestampResolver.java

+26-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import java.util.Locale;
2020
import java.util.TimeZone;
21+
import java.util.concurrent.locks.Lock;
22+
import java.util.concurrent.locks.ReentrantLock;
2123
import org.apache.logging.log4j.core.LogEvent;
2224
import org.apache.logging.log4j.core.time.Instant;
2325
import org.apache.logging.log4j.core.time.MutableInstant;
@@ -257,14 +259,25 @@ private static TimeZone readTimeZone(final TemplateResolverConfig config) {
257259

258260
private static final class PatternResolver implements EventResolver {
259261

262+
private final Lock lock = new ReentrantLock();
263+
260264
private final PatternResolverContext patternResolverContext;
261265

262266
private PatternResolver(final PatternResolverContext patternResolverContext) {
263267
this.patternResolverContext = patternResolverContext;
264268
}
265269

266270
@Override
267-
public synchronized void resolve(final LogEvent logEvent, final JsonWriter jsonWriter) {
271+
public void resolve(final LogEvent logEvent, final JsonWriter jsonWriter) {
272+
lock.lock();
273+
try {
274+
unsynchronizedResolve(logEvent, jsonWriter);
275+
} finally {
276+
lock.unlock();
277+
}
278+
}
279+
280+
private void unsynchronizedResolve(final LogEvent logEvent, final JsonWriter jsonWriter) {
268281

269282
// Format timestamp if it doesn't match the last cached one.
270283
final boolean instantMatching = patternResolverContext.formatter.isInstantMatching(
@@ -337,10 +350,21 @@ private EpochResolutionRecord() {
337350

338351
private abstract static class EpochResolver implements EventResolver {
339352

353+
private final Lock lock = new ReentrantLock();
354+
340355
private final EpochResolutionRecord resolutionRecord = new EpochResolutionRecord();
341356

342357
@Override
343-
public synchronized void resolve(final LogEvent logEvent, final JsonWriter jsonWriter) {
358+
public void resolve(final LogEvent logEvent, final JsonWriter jsonWriter) {
359+
lock.lock();
360+
try {
361+
unsynchronizedResolve(logEvent, jsonWriter);
362+
} finally {
363+
lock.unlock();
364+
}
365+
}
366+
367+
private void unsynchronizedResolve(final LogEvent logEvent, final JsonWriter jsonWriter) {
344368
final Instant logEventInstant = logEvent.getInstant();
345369
if (logEventInstant.equals(resolutionRecord.instant)) {
346370
jsonWriter.writeRawString(resolutionRecord.resolution, 0, resolutionRecord.resolutionLength);

0 commit comments

Comments
 (0)