一 可重入锁
二 Lock接口
Lock是一个接口,有三个实现类
- ReentrantLock:可重入锁
- ReentrantReadWriteLock:类中的静态内部类ReadLock(读锁)
- ReentrantReadWriteLock:类中的静态内部类WriteLock(写锁) ```java // JDK8源码:ReentrantLock public ReentrantLock() { sync = new NonfairSync(); // NonfairSync() 不公平锁 } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); // FairSync() 公平锁 }
// 不公平锁:十分不公平,线程可以插队(默认) // 公平锁:十分公平,线程先来后到
<a name="aCQtH"></a>
## 2.1 常用介绍
常用方式:在异常处理语句的finally语句中使用**Lock.unlock**方法。注意,加锁(**Lock.lock()**)的方法一般使用在 try 的外面,因为防止在加锁的过程中就已经抛出异常而被捕获,此时,解锁的方法会再抛出空指针异常。
```java
@Test
public void test(){
Lock l = new ReentrantLock();
l.lock(); // 加锁
try {
// access the resource protected by this lock }
finally {
l.unlock(); // 解锁
}
}
2.2 synchronized 和 Lock 的区别
1)synchronized 是Java内置的一个关键字;而Lock则是一个Java接口
2)synchronized 无法判断获取锁的状态;Lock可以判断是否获取了锁
3)synchronized 会自动释放锁;Lock必须自己手动释放锁,否则会造成死锁
4)synchronized 线程1(获取锁,阻塞)线程2(等待,乖乖的等);Lock锁就不一定会等待下去
5)synchronized 可重入锁,不可以中断,非公平;Lock,可重入锁,可以判断锁,非公平(可以设置为公平)
6)synchronized 适合锁少量代码的同步问题;Lock 适合锁大量的同步代码