多线程死锁问题!!理解不了

img

img

问题描述

图1:假设线程1获得书的锁,然后休眠1秒,将cpu给其他线程,线程2就拿到了笔的锁,所以就形成一个死锁,这个可以理解
图2:当线程1先执行,它先拿到书锁,然后休眠一秒,但是并不会释放锁的使用权,然后线程2拿到笔锁,按道理讲线程1不应该拿不到笔锁吗?

你的第二个图,本子和笔没有要求都要拿到,所以不会形成死锁,等待1秒只是执行的慢点而已。说明白点就是说,我要写字不要求笔和本子都有才能写,有笔我就在地上写,不等拿到本子,我有本子没有笔也能写。明白了吗?说经典的哲学家就餐问题,五个人中间放四支筷子,原文是要同时拿到左右手两只筷子才能吃饭,你例子中的意思就是拿一根筷子也能吃,只是吃的多少的问题,不存在,每人拿一根等别人放下另一根才能吃导致谁都吃不上饭。

对于图二,你把时间也打印一下就会发现,刚开始运行的时间,一个拿到了笔,一个拿到了书,然后都停了一秒,然后他们都释放了自己的锁,因为synchronized已经执行完,所以释放了,然后又去获取另一个锁;就都能获取到。
synchronized 锁的只是它包含的代码块,那段代码执行完就释放了;
图一会死锁是因为获取第二个锁的时候第一个锁还没释放,因为包含在同一个代码块里面

图二的代码:

  1. 线程1的执行序列是:拿到书锁,睡眠1秒,释放书锁,拿到笔锁,释放笔锁;
  2. 线程2的执行序列是:拿到笔锁,睡眠1秒,释放笔锁,拿到书锁,释放书锁;

线程1释放书锁之后会去拿笔锁,如果这个时候线程2已经拿到笔锁还没有释放,线程1会被阻塞,直到线程2释放笔锁之后,线程1才能拿到笔锁。
但是,这种情况不属于死锁,因为线程2的执行序列中,拿到笔锁后仍会释放笔锁,只是时间上需要等待1秒。
死锁的状态下,所有进入死锁的线程,都无法释放当前占用的锁。