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