Lock是显式锁的接口,默认实现是ReentrantLock。
方法摘要
public interface Lock {
//获取锁
void lock();
//如果当前线程未中断,则获取锁
void lockInterruptibly() throws InterruptedException;
//尽在调用锁为空闲时,才会获取锁
boolean tryLock();
//如果锁在给定时间内空闲,且当前线程未中断,则获取锁
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
//释放锁
void unlock();
//返会绑定在此Lock实例上的Condition实例
Condition newCondition();
}
Lock.unlock方法要放在finally语句块中,防止临界区异常之后不能正常释放锁而导致锁泄漏,而不像内部锁直接由JIT代为规避锁泄漏的问题。
Lock显式锁调度
ReentrantLock即支持公平锁也支持非公平锁。
公平锁意味着增加了线程的上下文切换,适合持有锁时间相对长或者申请锁时间较长的情形。
非公平锁是默认实现,增加了吞吐量,但是有可能造成饥饿。
显式锁和内部锁
- 在使用方面
内部锁基于代码块,简单易用,但是不太灵活,代码块不能跨方法,但是不会造成锁泄漏;另外没有提供监测锁的工具方法。
显式锁更加灵活,还提供tryLock()方法去尝试获取锁,而不会直接进入阻塞状态,且提供一些监控方法比如isLocked(), getQueueLength()检查等待线程数量等。 - 在调度方面
内部锁只支持非公平锁,显式锁支持公平和非公平锁。
JDK1.6之后对内部锁进行了优化,包括锁消除,锁粗化,偏向锁,轻量级锁,重量级锁。
网友评论