Java的ReentrantLock(可重入锁)详解上篇

本文介绍了Java并发包中的ReentrantLock(可重入锁),其利用AQS(AbstractQueuedSynchronizer)通过CAS操作实现高并发加锁。ReentrantLock分为公平锁和非公平锁,公平锁会根据请求顺序分配锁,而非公平锁不保证顺序。文章详细讲解了加锁过程,包括tryAcquire()、addWaiter()、acquireQueued()等方法的调用逻辑,并分析了shouldParkAfterFailedAcquire()方法的作用。这是ReentrantLock详解系列的上篇,下篇将探讨解锁逻辑及条件等待队列的协同工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java并发包下的ReentrantLock(可重入锁),实现了高并发下的加锁机制,原理是通过AQS(
AbstractQueuedSynchronizer,抽象的队列同步器)中循环调用CAS(compareAndSet,原子性操作)操作来实现加锁,它的性能比较好是因为尽最大努力的避免了使线程进入内核态的阻塞状态,Java并发包下的很多锁功能,本质都是使用了AQS(AbstractQueuedSynchronizer,抽象的队列同步器),该实现的作者是Doug Lea,ThreadPoolExecutor线程池也是这位外国大佬的杰作。

先看一下ReentrantLock(可重入锁)的类结构,如下图:

 

ReentrantLock(可重入锁)的类结构

ReentrantLock类包含三个内部类,分别是NonfairSync(非公平锁),FairSync(公平锁),Sync(同步器),其中Sync(同步器)又继承了
AbstractQueuedSynchronizer(AQS),本质也是由AQS实现了绝大部分的锁功能。

实例化创建公平锁和非公平锁,默认创建非公平锁。

 

实例化创建公平锁和非公平锁

公平锁和非公平锁的差别在于:

公平锁:先请求锁的线程会优先获取到锁,原理是所有需要获得锁的线程都会进入到队列中,队列的特点是先进先出,先进入的请求线程会在头部,后进入的请求线程都会在队列的尾部。

非公平锁:则不会按照线程请求获得锁的先后顺

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值