ReentrantLock继承了Lock接口并实现了在接口定义的方法,是一个可重入的独占锁。ReentrantLock通过自定义队列同步器(Abstract Queued Sychronized,AQS)来实现锁的获取与释放。
独占锁指该锁在同一时刻只能被一个线程获取,而获取锁的其他线程只能在同步队列中等候;可重入锁指该锁能够支持一个线程对同一个资源执行多次加锁操作。
ReentrantLock 支持公平锁和非公平锁的实现。公平指线程竞争锁的机制是公平的,而非公平指不同的线程获取锁的机制是不公平的。
ReentrantLock不但提供了synchronized对锁的操作功能,还提供了诸如可响应锁中断锁、可轮训锁请求、定时锁等避免多线程死锁的方法。
1.ReentrantLock的用法
ReentrantLock有显式的操作过程,何时加锁、何时释放锁都在程序员的控制下。具体的使用流程是定义一个ReentrantLock,在需要加锁的地方通过Lock方法加锁,等资源使用完成后再通过unlock方法释放锁。具体的实现代码如下:
package com.java.study.concurrent;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockDemo implements Runnable{
//step 1: 定义一个ReentrantLock
public static ReentrantLock lock = new ReentrantLock();
public static int i = 0;
@Override
public void run() {
for (int j = 0; j<10 ; j++) {
//step 2:加锁
lock.lock();
try {
i++;
}finally {
lock.unlock();//释放锁
}
}
}
public static void main(String[] args) throws InterruptedException {
ReentrantLockDemo reentrantLockDemo = new ReentrantLockDemo();
Thread t1 = new Thread(reentrantLockDemo);
t1.start();
t1.join();
System.out.println(i);
}
}
ReentrantLock之所以被称为可重入锁,是因为ReentrantLock锁可以反复进入。即允许连续两次获得同一把锁,两次释放同一把锁。