一 可重入锁

二 Lock接口

Lock是一个接口,有三个实现类

  1. ReentrantLock:可重入锁
  2. ReentrantReadWriteLock:类中的静态内部类ReadLock(读锁)
  3. ReentrantReadWriteLock:类中的静态内部类WriteLock(写锁) ```java // JDK8源码:ReentrantLock public ReentrantLock() { sync = new NonfairSync(); // NonfairSync() 不公平锁 } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); // FairSync() 公平锁 }

// 不公平锁:十分不公平,线程可以插队(默认) // 公平锁:十分公平,线程先来后到

  1. <a name="aCQtH"></a>
  2. ## 2.1 常用介绍
  3. 常用方式:在异常处理语句的finally语句中使用**Lock.unlock**方法。注意,加锁(**Lock.lock()**)的方法一般使用在 try 的外面,因为防止在加锁的过程中就已经抛出异常而被捕获,此时,解锁的方法会再抛出空指针异常。
  4. ```java
  5. @Test
  6. public void test(){
  7. Lock l = new ReentrantLock();
  8. l.lock(); // 加锁
  9. try {
  10. // access the resource protected by this lock }
  11. finally {
  12. l.unlock(); // 解锁
  13. }
  14. }

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 适合锁大量的同步代码