示例 SSCCE(修改):
public class ThreadTest {
public static void main(String[] args) {
new Thread() {
public void run() {
try {
FirstWord.writeFirstWord(false);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
new Thread() {
public void run() {
try {
SecondWord.writeSecondWord(false);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
class FirstWord {
public static synchronized void writeFirstWord(boolean fromSecondWord) throws Exception {
System.out.println("FirstWord start");
Thread.sleep(100);
if (!fromSecondWord) SecondWord.writeSecondWord(true);
System.out.println("FirstWord end");
}
}
class SecondWord {
public static synchronized void writeSecondWord(boolean fromFirstWord) throws Exception {
System.out.println("SecondWord start");
Thread.sleep(100);
if (!fromFirstWord) FirstWord.writeFirstWord(true);
System.out.println("SecondWord end");
}
}
如您所见,控制台显示:
FirstWord start
SecondWord start
第一个线程“进入”FirstWord
同步块,而第二个线程进入同步块SecondWord
。然后,在休眠一点之后,第一个线程尝试进入 SecondWord 方法,并且必须等待,因为第二个线程拥有该方法的锁。
当这种情况发生时,第二个线程也在等待获得另一个锁,这就是为什么两个线程都阻塞并且永远不会到达“结束”,因为它们永远不会获得两个锁。
如果您Thread.sleep
在这两种方法中删除它可能会起作用。如前所述,这是不可预测的。你不知道哪个线程会先进入。