ReentrantLock 原理解析(上)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: ReentrantLock 原理解析

ReentrantLock 源码解析


ReentrantLock 的核心是通过 AQS 实现的,具备了 AQS 的特征。


ReentrantLock 加锁过程


我们先说一下这例子: 以银行办理业务的案例来模拟我们的 AQS 是如何进行线程的管理和通知唤醒机制:


环境:有一个业务窗口 3 个排队的顾客;


类比(对号入座):3 个线程来模拟 3个排队的顾客,然后锁表示银行的窗口。

再来一个直观一点的示意图:


image.png


通过这个例子大家可以进行锁的调试和辅助理解,接下来我就以 ReentrantLock 中具体的方法来分析加锁、解锁过程。


代码例子:


// 以银行办理业务的案例来模拟我们的 AQS 是如何进行线程的管理和通知唤醒机制
// 3 个线程来模拟银行网点,受理窗口办理业务的顾客
// A 顾客就是第一个顾客,此时受理窗口没有任何人, A可以直接去办理
Lock lock = new ReentrantLock();
new Thread(() -> {
    lock.lock();
    System.out.println("  -------> A Thread come in");
    //  暂停几秒钟线程
    try { TimeUnit.MINUTES.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}
    lock.unlock();
}, "A").start();
// 第2个顾客,由于业务窗口只有一个(只能有一个线程持有锁),此时 B进行等待
// 进入候客区
new Thread(() -> {
    lock.lock();
    System.out.println("  -------> B Thread come in");
    try { TimeUnit.MINUTES.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}
    lock.unlock();
}, "B").start();
// 第3个顾客,由于业务窗口只有一个(只能有一个线程持有锁),此时 C进行等待
// 进入候客区
new Thread(() -> {
    lock.lock();
    System.out.println("  -------> C Thread come in");
    try { TimeUnit.MINUTES.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}
    lock.unlock();
}, "C").start();


ReentrantLock 核心方法


ReentrantLock 的方法和结构如下图所示,不得不说 Doug Lea 大神的水平还是非常高的,方法和命名上面其实都是见名知意的。还有就是这块公平锁(FairSync)、非公平锁(NonfairSync)  都是依赖 AbstractQueuedSynchronizer 这个模板方法实现的。


image.png


lock()


是加锁方法,默认为非公平锁。


构造方法如下所示:


image.png


lock 方法如下所示:


image.png


公平锁 lock 方法实现


image.png


相关文章
|
3天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
19天前
|
vr&ar
简单易懂的 全景图高清下载方法以及原理简要解析(支持下载建E、720yun、酷雷曼、景站、酷家乐、百度街景原图)
这篇文章介绍了一种简单易懂的全景图高清下载方法,使用在线网站全景管家,支持下载包括建E、720yun、酷雷曼等多个平台的全景图原图,并简要解析了全景图的原理和制作方法。
简单易懂的 全景图高清下载方法以及原理简要解析(支持下载建E、720yun、酷雷曼、景站、酷家乐、百度街景原图)
|
14天前
|
域名解析 网络协议
DNS服务工作原理
文章详细介绍了DNS服务的工作原理,包括FQDN的概念、名称解析过程、DNS域名分级策略、根服务器的作用、DNS解析流程中的递归查询和迭代查询,以及为何有时基于IP能访问而基于域名不能访问的原因。
30 2
|
22天前
|
JavaScript 前端开发 安全
JS 混淆解析:JS 压缩混淆原理、OB 混淆特性、OB 混淆JS、混淆突破实战
JS 混淆解析:JS 压缩混淆原理、OB 混淆特性、OB 混淆JS、混淆突破实战
26 2
|
22天前
|
缓存 前端开发 JavaScript
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
21 1
|
24天前
|
设计模式 JavaScript 前端开发
Vue响应式原理全解析
Vue的响应式系统是其核心特性之一,它使得Vue能够以高效的方式响应数据的变化。通过对对象属性的getter和setter进行劫持,Vue实现了对数据变化的侦测和依赖收集,当数据变化时能够自动派发更新。Vue3中,响应式系统得到了进一步的加强和优化,使用Proxy替代了 `Object.defineProperty`,带来了更好的性能和更强大的拦截能力。理解Vue的响应式原理,对于深入理解Vue的工作机制和进行高效的Vue开发都具有重要意义。
34 1
|
28天前
|
缓存 监控 网络协议
DNS缓存中毒原理
【8月更文挑战第17天】
62 1
|
10天前
|
负载均衡 网络协议 安全
DNS解析中的Anycast技术:原理与优势
【9月更文挑战第7天】在互联网体系中,域名系统(DNS)将域名转换为IP地址,但网络规模的扩张使DNS解析面临高效、稳定与安全挑战。Anycast技术应运而生,通过将同一IP地址分配给多个地理分布的服务器,并依据网络状况自动选择最近且负载低的服务器响应查询请求,提升了DNS解析速度与效率,实现负载均衡,缓解DDoS攻击,增强系统高可用性。此技术利用动态路由协议如BGP实现,未来在网络发展中将扮演重要角色。
35 0
|
1月前
|
域名解析 缓存 网络协议
DNS解析过程原理!
DNS解析过程原理!
|
17天前
|
开发者 安全 UED
JSF事件监听器:解锁动态界面的秘密武器,你真的知道如何驾驭它吗?
【8月更文挑战第31天】在构建动态用户界面时,事件监听器是实现组件间通信和响应用户操作的关键机制。JavaServer Faces (JSF) 提供了完整的事件模型,通过自定义事件监听器扩展组件行为。本文详细介绍如何在 JSF 应用中创建和使用事件监听器,提升应用的交互性和响应能力。
14 0

热门文章

最新文章

推荐镜像

更多