- Lock接口(和相关实现类)可以来用来实现锁功能。
- 缺少了隐式释放和获取锁的便捷性,但是多了获取和释放锁的可操作可中断的获取锁,以及超时获取锁等特性。
Lock使用的简单方式:
代码语言:javascript复制Lock lock = new ReentrantLock();
lock.lock();
try{}
finally{
lock.unlock();
}
Lock特性:
特性 | 描述 |
---|---|
尝试非阻塞的获取锁 | 当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取到,获取成功 |
能被中断的获取锁 | 获取到锁的线程能响应中断,当获取到锁的线程中断异常会被抛出,同时锁被释放 |
超时获取锁 | 在指定的截止时间之前获取锁,如果截止时间到了还没有获取到锁,则返回 |
Lock的API:
方法 | 描述 |
---|---|
void lock() | 当前线程获取锁,获取到锁后,从方法返回 |
void lockInterruptibly() throws InterrupedException | 可中断的获取锁,即在锁的获取中可以中断当前线程 |
bookean tryLock() | 尝试非阻塞的获取锁,调用后立即返回,能获取返回true,否则返回false |
boolean tryLock(long time, TimeUnit unit) throws InterruptedException | 超时的获取锁,在三种情况下返回1. 当前线程在超时时间内获取到了锁。2. 当前线程在超时时间内被中断3. 超时时间结束,返回false |
unlock() | 释放锁 |
Condition newCondition() | 获取等待通知组件,只有当前线程获取到了锁,才能调用该组件的wait()方法,调用后,当前线程释放锁 |