阿里巴巴|阿里技术三面:哲学家进餐( 三 )


第 2 种情况即先后进入临界区的 2 位哲学家的左右叉子存在竞争情况(说明这 2 位哲学家的编号相邻) , 因此后进入临界区的哲学家还需要等待 1 只叉子 , 才能就餐 。 此时可视为只有 1 个哲学家在就餐 。
至于“只允许 1 个哲学家就餐”的代码 , 很好理解 , 每次严格地只让 1 个哲学家就餐 , 由于过于严格 , 以至于都不需要将叉子视为ReentrantLock 。
方法三前面说过 , 该题的本质是考察如何避免死锁 。
而当 5 个哲学家都左手持有其左边的叉子或当 5 个哲学家都右手持有其右边的叉子时 , 会发生死锁 。
故只需设计1个避免发生上述情况发生的策略即可 。
即可以让一部分哲学家优先去获取其左边的叉子 , 再去获取其右边的叉子;再让剩余哲学家优先去获取其右边的叉子 , 再去获取其左边的叉子 。
代码如下:

改进:
位运算就可以表示5个叉子的使用状态 , 只需用1个volatile修饰的int变量即可 + CAS操作即可 , 即AtomicInteger类 。

写在最后本文内容出处是力扣官网 , 希望和大家一起刷算法 , 在后面的路上不变秃但是变强!
好兄弟可以点赞并关注我 , 全部都是干货 。

相关经验推荐