ReentrantLock
顾名思义是可重入锁。 它是synchronized的进化版,提供了对锁更灵活的控制。
它和 synchronized 有什么异同呢?
- 他们都是可重入锁
- 底层实现框架不一样 ReentrantLock 是基于aqs实现的
- ReentrantLock 支持获取锁超时:获取锁的适合设置一个时间,当它阻塞状态在等待获取锁的时候 如果等的够久了 就放弃
- ReentrantLock 支持获取锁可打断,和超时性质一样,获取锁的时候可以调用方法打断这个等待 告诉它你别等了
- 支持公平锁 这个很重要,当A,B线程争抢一把锁的时候 谁能获得锁完全看人品,但是设置了公平锁之后 会保证A,B依次获取到锁
ReentrantLock 的使用
给个简单的例子 体会一下和synchronized的不同
public class ReentrantLockThread extends Thread{
public static int count = 0;
//这里设置true意味着公平锁
static ReentrantLock lock = new ReentrantLock(true);
@Override
public void run(){
for (int i = 0; i < 101; i++) {
lock.lock();
try {
count++;
System.out.println(Thread.currentThread().getName()+"---"+count);
}finally{
lock.unlock();
}
}
}
}
可以体会一下
它获取锁和释放锁是通过调用方法
(乍一看像redis里面的分布式锁对吧,写个lock方法 里面写setnx)
lock.lock();
lock.unlock();
而不是用synchronized{}去包裹
这种在控制锁粒度方面会更灵活一点