并发能力夯实:ReentrantLock 源码分析!

文章内容已经收录在《高级技术专家成长笔记》,欢迎订阅专栏!

从原理出发,直击面试难点,实现更高维度的降维打击!

目录

  • [ReentrantLock 源码分析]
    • [ReentrantLock 源码结构]
    • [如何基于 AQS 扩展加锁功能?]
    • [ReentrantLock 如何实现公平锁?]
    • [ReentrantLock 如何实现解锁?]

ReentrantLock 源码分析

ReentrantLock 是 JDK1.5 开始提供的可重入锁,用于实现线程间互斥操作,有公平锁和非公平锁两种获取锁的方式。

AQS 提供了 CLH 队列锁来进行线程的阻塞等待和唤醒的功能。

ReentrantLock 底层基于 AQS 的线程阻塞、唤醒功能,实现了线程加锁,比如 tryLock()tryLock(timeout)lockInterruptibly() 功能。

ReentrantLock 源码结构

概括来说的话 ReentrantLock 就是在 AQS 外边套了一层皮,实现了加锁功能。

ReentrantLock 主要由 3 个类组成:

  • Sync :继承自 AbstractQueuedSynchronizer ,获得了线程阻塞、唤醒的能力,并扩展了获取锁、释放锁的功能。
  • NonfairSync :继承自 Sync ,提供了非公平获取锁的功能。
  • FairSync :继承自 Sync ,提供了公平获取锁的功能。

结构如下:

public class ReentrantLock implements Lock, java.io.Serializable {
    // 1、同步器
    abstract static class Sync extends AbstractQueuedSynchronizer {}
    // 2、非公平同步器
    static final class NonfairSync extends Sync {}
    // 3、公平同步器
    static final class FairSync extends Sync {}
}

如何基于 AQS 扩展加锁功能?

AQS 作为一个底层工具,仅提供了线程阻塞和唤醒的能力,并没有加锁能力,ReentrantLock 基于 AQS 的能力,实现了加锁、解锁等一系列功能。

接下来从 Reen

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

11来了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值