哲学家就餐问题如何避免死锁 如何避免死锁

线程同步导致的问题让多线程代码安全运行的方法是同步所有方法 。
效率低 。
如果每个方法都是同步的 , 那么大部分线程都会频繁阻塞,使得程序失去了并发的意义 。-
当使用多个锁时(Java中的每个对象都有自己的内置锁),线程之间可能会发生死锁 。
哲学家进餐问题-死锁-示意图哲学家进餐问题-死锁-代码代码非常简单 。哲学家类只有三个属性,左右筷子和随机:
哲学家阶层
以下是具体的逻辑代码:
测试此代码:
哲学家进餐问题-死锁-代码运行多久会死锁?在测试了五个哲学家的例子后,它最长可以运行一周,直到某个时刻突然停止 。
哲学家的用餐问题-僵局-原因如果所有的哲学家决定同时吃饭 , 拿起左手边的筷子,那就没法进行下去了——每个人都拿着一根筷子,等着右手边的人放下 。然后僵局出现了 。
哲学家进餐问题-死锁条件当一个线程需要多个锁时,需要考虑死锁的可能性 。
哲学家的用餐问题——如何避免僵局总是以全局固定顺序获取多个锁 。
不是按照左右手的顺序拿筷子 , 而是按照筷子的数量来获取锁(不用关心编号的具体规则,只要保证编号是全局唯一有序的就行) 。
如果获取锁的代码以集中的方式编写,则有利于维护这种全局顺序 。对于较大的程序来说,使用锁的地方比较分散 , 到处都按照这个顺序是不切实际的 。
使用对象的哈希值作为锁的全局顺序 。它适用于所有Java对象,不需要为锁对象定义和维护特殊的顺序 。
【哲学家就餐问题如何避免死锁 如何避免死锁】但是,对象的哈希值不能保证唯一性(对象的哈希值可能是重复的) 。除非万不得已,否则不要使用这种技术 。

    推荐阅读