并发编程 线程安全——Lock
lock
概述:
本质上Lock仅仅是一个接口
Lock有三个实现类
- ReentrantLock:表示重入锁 它是唯一一个实现了Lock接口的类
重入锁指的是线程在获得锁之后 再次获取该锁不需要阻塞 而是直接关联一次计数器增加重入次数 - ReentrantReadWriteLock:重入读写锁 它实现了ReadWriteLock接口
在这个类中维护了两个锁- ReadLock:读锁
- WriteLock:写锁
示例:
Lock l = ...; //根据不同的实现Lock接口类的构造函数得到一个锁对象
l.lock(); //获取锁位于try块的外面
try {
// 代码块
} finally {
l.unlock(); // 推荐把锁放到finally中 这样不管怎样都会被释放
}
接口方法:
//尝试获取锁,获取成功则返回,否则阻塞当前线程
void lock();
//尝试获取锁,线程在成功获取锁之前被中断,则放弃获取锁,抛出异常
void lockInterruptibly() throws InterruptedException;
//尝试获取锁,获取锁成功则返回true,否则返回false
boolean tryLock();
//尝试获取锁,若在规定时间内获取到锁,则返回true,否则返回false,未获取锁之前被中断,则抛出异常
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
//释放锁
void unlock();
//返回当前锁的条件变量,通过条件变量可以实现类似notify和wait的功能,一个锁可以有多个条件变量
Condition newCondition();