| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Java 源码 - 经验总结:各种锁在工作中使用场景和细节 -> 正文阅读 |
|
[Java知识库]Java 源码 - 经验总结:各种锁在工作中使用场景和细节 |
不啰嗦,我们直接开始! 引导语有的面试官喜欢让同学在说完锁的原理之后,让你重写一个新的锁,要求现场在白板上写出大概的思路和代码逻辑,这种面试题目,蛮难的,我个人觉得其侧重点主要是两个部分:
如果你看过源码,这道题真的很简单,你可以挑选一个你熟悉的锁进行模仿。 在锁章节中我们之前说的都是排它锁,这小节我们以共享锁作为案列,自定义一个共享锁。 1、需求一般自定义锁的时候,我们都是根据需求来进行定义的,不可能凭空定义出锁来,说到共享锁,大家可能会想到很多场景,比如说对于共享资源的读锁可以是共享的,比如对于数据库链接的共享访问,比如对于 Socket 服务端的链接数是可以共享的,场景有很多,我们选择共享访问数据库链接这个场景来定义一个锁。 2、详细设计假定(以下设想都为假定)我们的数据库是单机 mysql,只能承受 10 个链接,创建数据库链接时,我们是通过最原始 JDBC 的方式,我们用一个接口把用 JDBC 创建链接的过程进行了封装,这个接口我们命名为:创建链接接口。 共享访问数据库链接的整体要求如下:所有请求加在一起的 mysql 链接数,最大不能超过 10(包含 10),一旦超过 10,直接报错。 在这个背景下,我们进行了下图的设计: 这个设计最最关键的地方,就是我们通过能否获得锁,来决定是否可以得到 mysql 链接,如果能获得锁,那么就能得到链接,否则直接报错。 接着我们一起来看下落地的代码: 2.1、定义锁?首先我们需要定义一个锁出来,定义时需要有两个元素:
共享锁的代码实现如下:
从上述代码中可以看出,加锁和释放锁的实现,都依靠同步器 Sync 的底层实现。 唯一需要注意的是,锁需要规定好 API 的规范,主要是两方面:
以上这种思考方式是有方法论的,就是我们在思考一个问题时,可以从两个方面出发:API 是什么?API 有什么能力? 2.2、定义同步器 SyncSync 直接继承 AQS ,代码如下:
整个代码比较清晰,我们需要注意的是:
2.3、通过能否获得锁来决定能否得到链接锁定义好了,我们需要把锁和获取 Mysql 链接结合起来,我们写了一个 Mysql 链接的工具类,叫做 MysqlConnection,其主要负责两大功能:
首先我们看下 MysqlConnection 初始化的代码:
我们可以看到,在初始化时,需要制定最大的链接数是多少,然后把这个数值传递给锁,因为最大的链接数就是 ShareLock 锁的 state 值。 接着为了完成 1,我们写了一个 private 的方法:
然后我们实现 2,代码如下:
逻辑也比较简单,加锁时,如果获得了锁,就能返回 Mysql 的链接,释放锁时,在链接关闭成功之后,调用 releaseLimitConnection 方法即可,此方法会把锁的 state 状态加一,表示链接被释放了。 以上步骤,针对 Mysql 链接限制的场景锁就完成了。 3、测试锁写好了,接着我们来测试一下,我们写了一个测试的 demo,代码如下:
以上代码逻辑如下:
我们看下运行结果,如下图: 从运行的结果,可以看出,我们实现的 ShareLock 锁已经完成了 Mysql 链接共享的场景了。 4、总结?同学们阅读到这里不知道有没有两点感受:
锁章节最核心的就是 AQS 源码解析的两章,只要我们把 AQS 弄懂了,其余锁的实现,只要稍微看下源码实现,几乎马上就能知道其底层实现的原理,大多数都是通过操作 state 来完成不同的场景需求,所以还是建议大家多看 AQS 源码,多 debug AQS 源码,只要 AQS 弄清楚了,锁都很简单。 不啰嗦,文章结束,建议三连! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 19:21:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |