锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。
Lock
synchronized块或方法可以隐式的获取锁,但是它将锁的获取和释放固化了,即先获取再释放。
Lock,在JavaSE5之后,在使用时需要显式的获取和释放锁,相比于synchronized,拥有锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等同步特性。
Lock接口提供的synchronized关键字不具备的主要特性
特性 | 描述 |
尝试非阻塞的获取锁 | 当前线程尝试获取锁,如果这一时刻锁没有被其它线程获取到,则成功获取并持有锁 |
能被中断地获取锁 | 与synchronized不同,获取到的锁能够响应中断,当获取到锁的线程被中断时,中断异常将会抛出,同时锁会被释放 |
超时获取锁 | 在指定的截止时间之前获取锁,如果截止时间到了仍旧无法获取锁,则返回 |
Lock接口API
方法名称 | 描述 |
void lock() | 获取锁。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态 |
void lockInterruptibly() throws InterruptedException |
|
boolean tryLock() | 尝试非阻塞的获取锁。 仅在调用时锁为空闲状态才获取锁。如果锁可用,则获取锁,并立即返回值true,如果锁不可用,则此方法将立即返回值false |
boolean tryLock(long time,TimeUnit unit) throws InterruptedException | 超时的获取锁,当前线程在以下3种情况下会返回:
|
void unlock() | 释放锁 |
Condition newCondition() | 获取等待通知组件,该组件和当前的锁绑定,当前线程只有获得了锁,才能调用该组件的wait()方法,而调用后,当前线程将释放 |