锁
锁是用来控制多个线程访问共享资源的方式。
在Lock接口出现之前,Java程序是靠synchronized
关键字实现锁功能的,而Java SE 5之后,并发包中新增
了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized
关键字类似的同步功
能。
区别:
- 缺少了(
synchronized
)隐式获取释放锁的便捷性。 - 拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种
synchronized
关键字所不具备的同步特性(见下表)。
特性 | 描述 |
---|---|
尝试非阻塞获取锁 | 当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取,则成功获取并持有锁 |
能被中断的获取锁 | 获取锁的进程能响应中断,当获取到锁的进程被中断,中断异常会被抛出,同步锁释放 |
超时获取锁 | 在指定时间内获取锁,如果截止时间到了仍然没有获取锁。返回! |
代码:
Lock lock = new ReentrantLock();
lock.lock();
try {
//,,,,
} finally {
lock.unlock();
}
在 finally
块中释放锁,目的是保证在获取到锁之后,最终能够被释放。
Lock
的 API
// 获取锁
void lock();
// 可中断的获取锁,当前线程被中断时,无法获取同步锁!可以响应中断
void lockInterruptibly() throws InterruptedException;
// 尝试非阻塞的获取锁,获得时立即返回
boolean tryLock();
/*
超时获取锁,满足下面三种情况返回:
1.当前线程在限定时间内获取锁
2.当前线程在规定时间内被中断
3.超时,return false;
*/
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
// 释放锁
void unlock();
// 获取等待通知组件,调用wait方法以后,会释放同步锁。
// 底层为一个等待队列!后面会进行描述
Condition newCondition();