1. 一个特殊构造的程序
考虑下面这个专门为说明多线程中的死锁现象而构造的程序:
import java.util.LinkedList; public class Stack { public static void main(String[] args) { final Stack stack = new Stack(); new Thread("push") { @Override public void run() { for(int i = 0; i < 100; i++) { try { Thread.sleep(10); } catch (InterruptedException e) {} stack.push("object " + i); } } }.start(); new Thread("pop") { @Override public void run() { for(int i = 0; i < 100; i++) { try { System.out.println(stack.pop()); } catch (Exception e) {} } } }.start(); } LinkedList<Object> list = new LinkedList<Object>(); public synchronized void push(Object x) { System.out.println("begin to push " + x); synchronized (list) { list.addLast(x); notify(); } System.out.println("end to push " + x); } public synchronized Object pop() throws Exception { System.out.println("begin to pop"); synchronized (list) { if (list.size() <= 0) { wait(); } return list.removeLast(); } } } |
该程序构造了一个 Stack,启动了两个线程。一个线程向 Stack 中添加数据,另外一个线程从 Stack 中取出数据并打印。但是运行程序后就会发现程序输出:
begin to pop
begin to push object 0
后,在再也没有后续输出了。