Lock锁特性和常用API
Lock接口提供了与synchronized
关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。Lock锁缺少了隐式获取锁的便捷性,拥有锁获取和释放的可操作性、可中断地获取锁以及超时获取锁等多种特性。
使用注意:在
finally
块中释放锁,目的是保证在获取到锁之后,最终能够被释放。
Lock接口提供的synchronized
关键字不具备的主要特性:
特性 | 描述 |
---|---|
尝试非阻塞地获取锁 | 当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁 |
能被中断地获取锁 | 与synchronized不同,获取到锁的线程能够响应中断,当获取到锁的线程被中断时,中断异常将会被抛出,同时锁会被释放 |
超时获取锁 | 在指定的截止时间之前获取锁,如果截止时间到了仍旧无法获取到锁,则返回 |
Lock的API:
API | 描述 |
---|---|
void lock(); |
获取锁,调用该方法当前线程将会获取锁,当获取到锁后,从该方法返回 |
void lockInterruptibly() throws InterruptedException; |
可中断地获取锁,和lock() 方法的不同之处在于该方法会响应中断,即在锁的获取中可以中断当前线程 |
boolean tryLock(); |
尝试非阻塞地获取锁,调用该方法后立即返回,如果能够获取则返回true,否则返回false |
boolean tryLock(long time, TimeUnit unit) throws InterruptedException; |
超时地获取锁,当前线程在以下3种情况下会返回: - 当前线程在超时时间内获取到了锁 - 当前线程在超时时间内被中断 - 超时时间结束,返回false |
void unlock(); |
释放锁 |
Condition newCondition(); |
获取等待通知组件,该组件和当前的锁绑定,当前线程只有获得了锁,才能调用该组件的wait() 方法,调用后,当前线程将释放锁 |
资料:https://www.bilibili.com/video/BV1ac411671e/ 强推 河北王校长