ReentrantLock 可重入锁总结
本文为博主原创,未经允许不得转载:
ReentrantLock 是一种内置锁,也叫可重入锁(ReentrantLock),它允许线程再次获取已持有的同步锁,这样防止死锁的发生。在使用ReentrantLock时,需要手动获取和释放同步锁,即使出现异常,也一定要保证每次获取和释放同步锁的次数一致。
ReentrantLock 的主要特点如下:
-
可重入性:同一线程可以进入获取同步锁,也可以再次获取持有的同步锁。
-
可中断性:在等待获取同步锁的线程可以响应中断,也就是当线程处于等待获取同步锁的状态时,可以中断等待,它不会永久长时间等待下去。
-
公平锁:锁获取是公平的,多个线程通过 ReentrantLock 获取锁时,会先进入同步队列中,按照顺序获取同步锁,减少了线程间的竞争。
使用ReentrantLock的步骤:
-
创建ReentrantLock对象,通过构造方法可以选择公平锁或非公平锁;
-
在需要同步的代码块中,在使用ReenrantLock的lock()方法获取同步锁,在同步代码块执行完之后必须手动释放同步锁,否则会出现死锁的现象;
-
对于可能抛出异常的同步代码块,在finally中一定要释放同步锁。
示例代码:
ReentrantLock lock = new ReentrantLock(); // 创建ReentrantLock对象 try { lock.lock(); // 获取同步锁 // 同步代码块 } finally { lock.unlock(); // 释放同步锁 }
可重入锁的示例说明
import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockExample { private static final ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { new Thread(() -> { lock.lock(); // 获取同步锁 try { System.out.println(Thread.currentThread().getName() + " 获取锁"); doSomething(); // 调用可重入方法 } finally { lock.unlock(); // 释放同步锁 } }, "Thread-1").start(); new Thread(() -> { lock.lock(); // 获取同步锁 try { System.out.println(Thread.currentThread().getName() + " 获取锁"); doSomething(); // 调用可重入方法 } finally { lock.unlock(); // 释放同步锁 } }, "Thread-2").start(); } public static void doSomething() { lock.lock(); // 再次获取同步锁 try { System.out.println(Thread.currentThread().getName() + " 再次获取锁,并执行业务逻辑"); } finally { lock.unlock(); // 释放同步锁 } } }
在该示例中,创建了一个静态的ReentrantLock对象。两个线程分别获取同步锁,调用了一个可重入方法doSomething(),该方法中又再次获取了同步锁,这样就实现了可重入性。注意,在使用ReentrantLock时,必须手动获取和释放同步锁,避免出现死锁。