ReentrantLock 是继承了Lock接口,并且实现了再接口中定义的方法,属于一个可重入的独占锁。ReentrantLock 通过自定义队列同步器(Abstract Queued Synchroinzed,AQS)来实现锁的获取与释放。
那么什么是独占锁呢?独占锁就是指这个锁在同一时刻只能被一个线程所获取到,如果其他线程想要获取到这个锁,则只能在同步队列中等待;而锁的可重入是指同一个线程对同一个资源能够执行多次加锁操作。
ReentrantLock 支持公平锁与非公平锁的实现。也就是说线程对于锁竞争的机制是相对公平的,而非公平是说,线程获取锁的机制是不公平的,这里有两个概念需要注意,一个是竞争机制,一个是获取机制。
ReentrantLock 提供了Synchroinzed对锁的操作,还提供了例如可响应中断锁、可轮询锁请求、定时锁等方式来避免在操作过程中出现死锁。
ReentrantLock的用法
ReentrantLock 对于锁的操作是有明显的操作过程,例如什么时候进行加锁、什么时候对锁进行释放。这些操作都是在开发者手中可以控制的。
public class ReenterLockDemo implements Runnable {
// 定义一个 ReentrantLock 锁
public static ReentrantLock lock = new ReentrantLock();
public static int i =0;
@Override
public void run() {
for (int j = 0; j < 10; j++) {
lock.lock();//进行加锁操作
// lock.lock(); //锁的可重入
try{
i++;
}finally {
lock.unlock();// 释放锁
// lock.unlock();//可重入锁
}
}
}
public static void main(String[] args) throws InterruptedException {
ReenterLockDemo reenterLockDemo = new ReenterLockDemo();
Thread t1 = new Thread