上一篇:重排序:https://blog.csdn.net/pcwl1206/article/details/84930669
1、Lock接口
锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但有些锁可以允许多个线程并发访问共享资源,比如:读写锁)。
在Lock接口出现之前,Java程序靠synchronized关键字实现锁功能。而Java SE5之后,并发包中新增了Lock接口用来实现锁功能,它提供了与synchronized关键字类似的同步功能。但在使用时需要显示的获取和释放锁。虽然他缺少了隐式获取和释放锁的便捷性,但却拥有了锁获取与释放的可操作性、可中断性及超时获取锁等synchronized关键字不具备的同步特性。
- Lock的使用
Lock lock = new ReentrantLock();
lock.lock();
try{
// ...
}finally{
lock.unlock();
}
需要对Lock的使用进行两点说明:
1、在finally中释放锁:保证在获取锁之后,最终能够被释放;
2、不要将获取锁的过程写在try块中,因为如果在获取锁时发生了异常,异常抛出的同时,也会导致锁无故释放。
- Lock接口提供的synchronized关键字不具备的主要特性
- Lock接口中的API
Lock接口的实现基本上都是通过聚合了一个同步器的子类来完成线程访问控制的。
看下Lock接口中的源码,实际上也就是上表中的这些API:
public interface Lock {
// 获取锁
void lock();
// 可中断的获取锁
void lockInterruptibly() throws InterruptedException;
// 尝试阻塞的获取锁
boolean tryLock();
// 超时获取锁
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
// 释放锁
void unlock();
// 获取等待通知组件,该组件和当前锁绑定
Condition newCondition();
}
2、队列同步器
由于队列同步器比较重要,内容也比较多,单独写一篇文章用于讲解。
点击查看以下文章:
扫描二维码关注公众号,回复:
4504819 查看本文章
4、队列同步器AQS源码分析之Condition接口、等待队列