diff --git a/slf4j-simple/src/main/java/org/slf4j/impl/SimpleLogger.java b/slf4j-simple/src/main/java/org/slf4j/impl/SimpleLogger.java index cc1ffc6c0..c8cce132f 100644 --- a/slf4j-simple/src/main/java/org/slf4j/impl/SimpleLogger.java +++ b/slf4j-simple/src/main/java/org/slf4j/impl/SimpleLogger.java @@ -26,8 +26,6 @@ import java.io.PrintStream; import java.util.Date; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.ReentrantLock; import org.slf4j.Logger; import org.slf4j.event.LoggingEvent; @@ -314,6 +312,13 @@ protected String renderLevel(int level) { throw new IllegalStateException("Unrecognized level [" + level + "]"); } + /** + * To avoid intermingling of log messages and associated stack traces, the two + * operations are done in a synchronized block. + * + * @param buf + * @param t + */ void write(StringBuilder buf, Throwable t) { PrintStream targetStream = CONFIG_PARAMS.outputChoice.getTargetPrintStream(); diff --git a/slf4j-simple/src/test/java/org/slf4j/simple/multiThreadedExecution/MultithereadedExecutionTest.java b/slf4j-simple/src/test/java/org/slf4j/simple/multiThreadedExecution/MultithereadedExecutionTest.java index 942cc1544..3888cbc4d 100755 --- a/slf4j-simple/src/test/java/org/slf4j/simple/multiThreadedExecution/MultithereadedExecutionTest.java +++ b/slf4j-simple/src/test/java/org/slf4j/simple/multiThreadedExecution/MultithereadedExecutionTest.java @@ -40,6 +40,8 @@ public class MultithereadedExecutionTest { private static int THREAD_COUNT = 2; + private static long TEST_DURATION_IN_MILLIS = 100; + private Thread[] threads = new Thread[THREAD_COUNT]; private final PrintStream oldOut = System.out; @@ -69,7 +71,7 @@ public void test() throws Throwable { threads[1] = new Thread(other); threads[0].start(); threads[1].start(); - Thread.sleep(100); + Thread.sleep(TEST_DURATION_IN_MILLIS); signal = true; threads[0].join(); threads[1].join(); @@ -86,10 +88,9 @@ public void test() throws Throwable { class WithException implements Runnable { - Throwable throwable; + volatile Throwable throwable; Logger logger = LoggerFactory.getLogger(WithException.class); - @Override public void run() { int i = 0; @@ -108,10 +109,9 @@ public void run() { } class Other implements Runnable { - Throwable throwable; + volatile Throwable throwable; Logger logger = LoggerFactory.getLogger(Other.class); - @Override public void run() { int i = 0; while (!signal) { @@ -125,5 +125,4 @@ public void run() { } } } - } diff --git a/slf4j-simple/src/test/java/org/slf4j/simple/multiThreadedExecution/StateCheckingPrintStream.java b/slf4j-simple/src/test/java/org/slf4j/simple/multiThreadedExecution/StateCheckingPrintStream.java index d9ae79ea1..e4dbe1489 100755 --- a/slf4j-simple/src/test/java/org/slf4j/simple/multiThreadedExecution/StateCheckingPrintStream.java +++ b/slf4j-simple/src/test/java/org/slf4j/simple/multiThreadedExecution/StateCheckingPrintStream.java @@ -25,20 +25,20 @@ package org.slf4j.simple.multiThreadedExecution; import java.io.PrintStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import java.util.regex.Pattern; +/** + * This PrintStream checks that output lines are in an expected order. + * + * @author ceki + */ public class StateCheckingPrintStream extends PrintStream { enum State { INITIAL, UNKNOWN, HELLO, THROWABLE, AT1, AT2, OTHER; } - List stringList = Collections.synchronizedList(new ArrayList()); - - State currentState = State.INITIAL; + volatile State currentState = State.INITIAL; public StateCheckingPrintStream(PrintStream ps) { super(ps); @@ -57,6 +57,7 @@ public void println(String s) { break; case UNKNOWN: + // ignore garbage currentState = next; break; @@ -98,8 +99,6 @@ public void println(String s) { default: throw new IllegalStateException("Unreachable code"); } - - stringList.add(s); } private IllegalStateException badState(String s, State currentState2, State next) {