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 状态。这是一个典型死锁的例子。
饥饿
饥饿是指线程长时间无法获得共享资源从而继续相继的处理。这种情况经常发生在当
“
”
共享资源被 贪婪 线程长时间占据时。假设一个对象提供的互斥方法需要很长时间处理才
能返回,然而如果某线程老是频繁激活这个方法,那么其他需要访问该对象的线程就会
被长时间阻塞,而处于饥饿状态。
活锁
一种常见的线程动作是响应另外线程的动作。然而如果另外线程的动作恰好也是该线
程的响应,那么活锁现象就可能会产生。正如死锁一样,处于活锁状态的线程通常不能继