JDK5提供的显式锁
java 5引入 java.util.concurrent
包。
Reentrant lock
提供了显式的 lock
和 unlock
方法,可以突破上述几个限制。
JDK5提供的显式锁ReentrantLock
JDK5提供的显式锁 ReentrantLock 可中断的锁
用 ReentrantLock
替代内置锁,使用 lockInterruptibly()
方法
上面的代码可以使用 Thread .interrupt()
让线程终止。
JDK5提供的显式锁 ReentrantLock 超时 解决哲学家就餐问题
可以为获取锁的操作设置超时时间。
与lock()相比,tryLock()有超时机制。
上面实现的哲学家就餐问题的代码并不会 死锁 (至少不会无尽地死锁下去)。
活锁
哲学家就餐问题的 tryLock()
方案避免了无尽的死锁,但这并不是一个好的方案。
首先,不能避免死锁——只是提供了从死锁中恢复的手段。
其次,受到活锁现象的影响——如果所有死锁线程同时超时,极有可能再次陷入死锁。虽然死锁没有永远持续下去,但对资源的争夺状况却没有得到任何改善。
减小活锁的几率方法:为每个线程设置不同的超时时间,来减少所有线程同时超时的几率。