background image

30 
31   System.out.format("%s: %s has bowed back to me!%n",
32 
33   this.name, bower.getName());
34 
35   }
36 
37   }
38 
39   public static void main(String[] args) {
40 
41   final Friend a = new Friend("A");
42 
43   final Friend b = new Friend("B");
44 
45   new Thread(new Runnable() {
46 
47   public void run() { a.bow(b); }
48 
49   }).start();
50 
51   new Thread(new Runnable() {
52 
53   public void run() { b.bow(a); }
54 
55   }).start();
56 
57   }
58 
59   }
60
  这时两个朋友之间线程就可能产生死锁。两个线程有可能同时处于 bow 状态,分别
等待另外一个人 bowBack。两个线程永远不会终止,每个线程都在等待另外一个线程退
出 bow 状态。这是一个典型死锁的例子。
  饥饿
  饥饿是指线程长时间无法获得共享资源从而继续相继的处理。这种情况经常发生在当

共享资源被 贪婪 线程长时间占据时。假设一个对象提供的互斥方法需要很长时间处理才
能返回,然而如果某线程老是频繁激活这个方法,那么其他需要访问该对象的线程就会
被长时间阻塞,而处于饥饿状态。
  活锁
  一种常见的线程动作是响应另外线程的动作。然而如果另外线程的动作恰好也是该线
程的响应,那么活锁现象就可能会产生。正如死锁一样,处于活锁状态的线程通常不能继