重入锁(ReentrantLock)是Java中的一种显式锁实现,它允许线程重复获取同一个锁。这意味着一个线程可以多次获得同一个锁而不被阻塞,使得线程能够以递归的方式进入由同一个锁保护的代码块。
与synchronized关键字相比,ReentrantLock提供了更多的灵活性和功能。下面是ReentrantLock与synchronized关键字的主要区别:
-
可中断性:ReentrantLock提供了lockInterruptibly方法,允许线程在等待锁的过程中可以响应中断,而synchronized关键字不支持这样的操作。
-
公平性选择:ReentrantLock可以作为公平锁使用,即等待时间最长的线程将获得锁,而synchronized则无法指定是否为公平锁。
-
条件变量支持:ReentrantLock可以配合Condition对象实现精确地线程等待/通知机制,而synchronized无法直接支持这种功能。
-
尝试获取锁:ReentrantLock提供了tryLock方法,能够尝试获取锁而不被阻塞,而synchronized无法实现这种非阻塞式的锁获取。
-
锁的释放:使用synchronized时,锁的释放由JVM隐式管理;而ReentrantLock需要显式调用unlock方法来释放锁,这样就能够更灵活地控制锁的释放时机。
import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private final ReentrantLock lock = new ReentrantLock();public void performTask() {lock.lock(); // 获取锁try {// 受保护的临界区域// ...performSubTask(); // 在同一个线程中再次获取锁,不会被阻塞// ...} finally {lock.unlock(); // 释放锁}}public void performSubTask() {lock.lock(); // 再次获取同一个锁,不会被阻塞try {// 受保护的临界区域// ...} finally {lock.unlock(); // 释放锁}}}
在上面的示例中,performTask方法和performSubTask方法都在同一个线程内多次获取了同一个ReentrantLock,而不会造成死锁或阻塞。这展示了重入锁的特性。
本篇文章来源于微信公众号: 互联网面试小帮手
微信扫描下方的二维码阅读本文

Comments NOTHING