哲学家就餐问题造成死锁问题的关键在于两个synchronized块的叠加,当拿到左筷子时候,再去尝试拿右筷子拿不到则会陷入死锁状态。
解决办法可以利用ReentrantLock锁的超时特性,改用tryLock方法获取锁,当拿到左筷子,尝试获取右筷子而获取不到的时候,干脆直接将左筷子释放掉,这样可以使得其他人拿左筷子,从而避免死锁现象的发生。
线程run方法改成如下代码:
@Overridepublic void run() {while (true){//不是吃饭就是睡觉,所以要加while//尝试获取左筷子if(left.tryLock()){try{if(right.tryLock()){try{//这里是两个锁均拿到的执行代码eat();}finally {right.unlock();}}}finally {left.unlock();}}}}
