Lock和ReentrantLock

Lock

特征:

  1. 提供无条件的、可轮询的、定时的、可中断的锁获取操作
  2. 显式的加锁、解锁

实现类:

  • ReentrantLock
  • ReentrantReadWriteLock.ReadLock
  • ReentrantReadWriteLock.WriteLock

API:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public abstract interface Lock{
//获取锁
//如获取失败,禁用当前线程,知道得到锁之前,线程将一直处于休眠
public abstract void lock();

//获取锁
//如获取失败,【同上】
//线程在获取锁时被中断,抛出异常,清除当前线程的已中断状态
//question: 锁中断如何使用
public abstract void lockInterruptibly() throws InterruptedException;

//仅在调用时,锁为空闲状态才获取该锁
//可用,则获取,返回true
//否则,返回false
public abstract boolean tryLock();

//一定时间内尝试获取锁,否则抛出异常
public abstract boolean tryLock(long paramLong, TimeUnit paramTimeUnit) throws InterruptedException;

//解锁
public abstract void unlock();

//返回锁的条件对象
public abstract Condition newCondition();
}

Lock与synchronized比较

Lock synchronized
使用灵活 使用简单
必须手动加锁、解锁 关键字搞定
锁代码块 锁是对象(this…)

ReentrantLock

Lock的实现类,是一个互斥的同步器。竞争条件下,比synchronized实现具有更好的伸缩性。

公平锁

获取锁时判断,是否有前置节点在等待中,有则休眠,等待

非公平锁img

释放锁

==图示两种锁策略==