}
catch(Exception e)
{
System.out.println(e.getMessage());
}
System.out.println(name + " trying to call A.last()");
a.last();
}
synchronized void last()
{
System.out.println("inside A.last");
}
}
class Deadlock implements Runnable
{
A a=new A();
B b=new B();
Deadlock()
{
//设置当前线程名称
Thread.currentThread().setName("MainThread");
new Thread(this).start();
a.foo(b); //get lock on a in this thread.
System.out.println("back in main thread");
}
public void run()
{
Thread.currentThread().setName("RacingThread");
b.bar(a); //get lock on a in other thread.
System.out.println("back in other thread");
}
public static void main(String[] args)
{
new Deadlock();
}
}
从结果可以看出,RacingThread进入了b的监视器,然后又在等待a的监视器。同时MainThread进入了a的监视器并等待b的监视器。这个程序永远不会完成。
线程间通信
一个线程向数据存储空间添加数据(生产者),另一个线程从数据存储空间取出数据(消费者)
这个程序有两种以外需要考虑:
1、 假设生产者线程刚向数据存储空间添加了一个人的姓名,还没有加入这个人的性别,
CPU就切换到了消费者线程,消费者线程将把这个人的姓名和上一个恶人的性别联系到了一起
9
7
3
11
12
13
14
15
16
17
18
19
20
4
8
: