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