Поскольку строка, которая печатает «SHOUT ...», не требует блокировки, она может появиться в любой точке. Таким образом, даже если один поток удерживает блокировку, другой поток может войти и вывести «SHOUT ...».
Следующий код показывает чередование:
public class Interleave {
public static void main(String[] args) throws Throwable {
Task task = new Task();
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
Thread.sleep(25);
t2.start();
}
private static class Task implements Runnable {
public void run() {
shout();
}
private void shout() {
System.out.println("SHOUT " + Thread.currentThread().getName());
synchronized (this) {
System.out.println("Synchronized Shout " + Thread.currentThread().getName());
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Synchronized Shout " + Thread.currentThread().getName());
}
}
}
}
Распечатывает
SHOUT Thread-0
Synchronized Shout Thread-0
SHOUT Thread-1
Synchronized Shout Thread-0
Synchronized Shout Thread-1
Synchronized Shout Thread-1