Lock接口
Lock接口是在Java SE5之后出现的,在并发包中新增的Lock接口以及相关的实现类来实现锁的功能。
Lock和synchronized关键字的区别
synchronized可以隐式的获取释放锁(通过synchronized方法块或者方法实现)。Lock接口在使用的时候需要显式的获取释放锁。但是拥有了锁的获取和释放的可操作性行、可中断的获取锁,以及超时获取锁等多种synchronized不具备的功能。
synchronized关键字会隐式的获取释放锁,相当于把锁固化了,虽然简便了同步的管理但是扩展性就远不如Lock接口所实现的锁功能。
Lock提供的synchronized不具备的关键特性
特性 | 描述 |
---|---|
尝试非阻塞的获取锁 | 当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取到,则成功获取到锁 |
能被中断的获取锁 | 与synchronized不同,获取到锁的线程能被中断,中断时抛出中断异常,同时锁会被释放 |
超时获取锁 | 在指定的时间内获取到锁,如果规定时间内没有获取到锁,则返回 |
Lock的API
方法名 | 描述 |
---|---|
void lock() | 获取锁,调用该方法当前线程会获得锁,获得锁后返回 |
void lockInterruptibly()throws InterruptedException | 可中断的获取锁,该方法会响应中断,在锁的获取中可以中断当前线程 |
boolean tryLock | 尝试非阻塞的获取锁,调用该方法立即返回。如果获取到返回true,否则false |
boolean tryLock(long time, TimeUnit unit)throws InterruptedException | 超时的获取锁,在三种情况下会返回:1、线程在时间内获得锁 2、线程在时间内被中断 3、时间结束,返回false |
void unlock() | 释放锁 |
Condition newCondition() | 获得等待通知组件,该组件和当前的锁绑定,当前线程只有获得了锁,才能调用该组件的wait()方法,调用后,当前线程将释放锁 |