Lock的使用
参考:
1、 Lock
基本使用
1.1 语法
Lock
接口,ReentranLock
就是Lock
接口的实现类。
// 实例化一个对象(默认是非公平锁)
Lock lock = new ReentrantLock();
lock.lock();
try {
// ..
} finally {
//一定在finally中释放锁
lock.unlock();
}
注意:
- 在
finally
块中释放锁,目的是保证在获取到锁之后,最终能够被释放,否则会造成死锁 - 不要将获取锁的过程写在 try 块中:因为如果在
lock.lock()
获取锁)时发生了异常(即try中异常抛出),那么就会在finally中进行lock.unlock()
。 此时,由于获取锁时失败,那么释放锁时就会导致IllegalMonitorStateException
异常。
1.2 常用API
lock.lock()
:获取锁,如果锁被暂用则一直等待lock.tryLock()
: 获取锁,立即返回,不等待:如果获取锁的时候锁被占用就返回false,否则返回trueLock.tryLock(long time, TimeUnit unit) throw InterruptedException
:同lock.tryLock()
只是多了获取锁的超时时间。Lock.lockInterruptibly()
:获取锁时可以相应中断lock.unlock()
:释放锁
1.2.1 Lock的Condition
接口:public interface Condition
创建:Condition condition = lock.newCondition()
它用来替代传统的Object的wait()、notify()
Condition | Object | 描述 |
---|---|---|
await() | wait() | 阻塞 |
signal() | notify() | 唤醒 |
signalAll() | notifyAll() |