今天无意中看到优快云上zyplus关于wait,notify的精彩讲述,原文地址在:http://blog.youkuaiyun.com/zyplus/article/details/6672775,但文中的示例程我拷贝下来后发现是死锁,看了下面的评论,找到了问题所在。仔细回想了程序的执行过程,还原了一下死锁的发生过程,过程如下。
这个程序的执行过程:线程a获取c的锁,获取自身锁,打印A,notify操作,c进行wait操作,线程a不能访问c;
切换到线程b,获取a的锁,获取自身锁,打印B,notify操作,a进行wait操作,线程b不能访问a;
切换到线程c,获取b的锁,获取到自身锁,打印C,notify操作(现在线程a可以访问c了),b进行wait操作;
进行完第9次时,b,a都进行了wait操作,线程b不能访问a,线程c不能访问b;第10次时线程a打开自身,关闭c(线程a不能访问c),同于线程b不能访问a,线程c不能该问b,第11次时线程a执行完,无法打开自身;那么线程b不能访问a,于是它就开始等待a打开自身,c就会等待b打开自身,从而锁住程序
这个程序的执行过程:线程a获取c的锁,获取自身锁,打印A,notify操作,c进行wait操作,线程a不能访问c;
切换到线程b,获取a的锁,获取自身锁,打印B,notify操作,a进行wait操作,线程b不能访问a;
切换到线程c,获取b的锁,获取到自身锁,打印C,notify操作(现在线程a可以访问c了),b进行wait操作;
进行完第9次时,b,a都进行了wait操作,线程b不能访问a,线程c不能访问b;第10次时线程a打开自身,关闭c(线程a不能访问c),同于线程b不能访问a,线程c不能该问b,第11次时线程a执行完,无法打开自身;那么线程b不能访问a,于是它就开始等待a打开自身,c就会等待b打开自身,从而锁住程序