哲学家就餐问题造成死锁问题的关键在于两个synchronized块的叠加,当拿到左筷子时候,再去尝试拿右筷子拿不到则会陷入死锁状态。
    解决办法可以利用ReentrantLock锁的超时特性,改用tryLock方法获取锁,当拿到左筷子,尝试获取右筷子而获取不到的时候,干脆直接将左筷子释放掉,这样可以使得其他人拿左筷子,从而避免死锁现象的发生。

    线程run方法改成如下代码:

    1. @Override
    2. public void run() {
    3. while (true){//不是吃饭就是睡觉,所以要加while
    4. //尝试获取左筷子
    5. if(left.tryLock()){
    6. try{
    7. if(right.tryLock()){
    8. try{
    9. //这里是两个锁均拿到的执行代码
    10. eat();
    11. }finally {
    12. right.unlock();
    13. }
    14. }
    15. }finally {
    16. left.unlock();
    17. }
    18. }
    19. }
    20. }