博客
关于我
JUC源码分析-序章
阅读量:626 次
发布时间:2019-03-14

本文共 1528 字,大约阅读时间需要 5 分钟。

ReentrantLock Analysis

接下来,我将从ReentrantLock开始分析JUC包中的锁源码。ReentrantLock是我在开发中经常使用的锁,了解它的实现对我来说至关重要。

第一步,我会仔细阅读ReentrantLock类的字段定义。主要字段有fairness和Queue。fairness用来控制锁的公平性,默认为FAIRileceği公平策略,即当资源允许线程获取时,按照线程到达的顺序先获取;如果设置为NonFair,可能让线程获取锁的顺序不那么严格。

其次,我会查看private final Thread[] waiters; 这个字段似乎用来存储正在等待锁的线程。当有线程阻塞时,它会被加入到waiters数组中。

构造函数方面,默认的构造函数是无参数的,可传入的ReentrantLock初始化时会设置优先级,这一点需要注意。另一个构造函数用于设置公平性,这对于调优非常有用。

锁的获取流程是关键。ReentrantLock的lock()方法会先尝试获取锁,如果当前没有被另一个线程占据,那么会记录该线程并传播_CALLABLE。有一次获取不成功的话,线程会被存入队列,并放置到一个等待队列中进行等待。这里我注意到ReentrantLock采用自旋队列,可能更高效。

lockInterruptibly()方法要与lock()不同,它会在当前线程被打断(interrupted)之前和之后,仅在当前线程持有锁时才允许获取锁。这里打断并重新进入主循环,这让我想到这样的机制确保线程不会因异步操作被打断而未能处理锁的状态。

tryLock()方法是一个非阻塞的尝试获取锁。如果不成功,它会返回false,这样可以让上层逻辑决定是否需要等待或者放弃。这种机制在设计并发代码时很有用,可以避免死锁。

ReentrantLock的性能优化也是需要关注的地方。自旋队列的设计可以减少等待时间,但过度自旋也会增加系统开销,所以平衡点至关重要。ReentrantLock是通过记录每个线程是否重复使用锁资源来实现递归获取的,这在保护资源的使用中非常关键。

可能的疑问点在于自旋队列和等待队列的具体实现,以及如何在多核处理器中分配waiters,让任务均匀分布,避免CPU空闲。Another thing is how to handle interrupted exception in different methods, especially in lockInterruptibly().

最后,重入机制很重要,允许线程获得多次锁,这对于递归和其他多个任务都需要在同一线程中访问资源的情况非常有用。这一点在数据库连接池里实现连接的获取就是典型例子,可以多次递归获取锁,释放后再递归获取,确保数据库连接的不被其他线程抢占用。

总体来说,ReentrantLock提供了强大而灵活的锁机制,它的实现内字对于理解JUC包锁的工作原理非常有帮助。下一阶段,我会深入研究ReentrantLock的源码,分析其具体实现细节,包括队列管理、条件wait/signal,以及重入机制。之后,我可以对比其他锁,如Synchronized和Lock,看看它们是如何实现的。

我还想了解具体的性能测试,ReentrantLock在高并发场景下是否有优缺点,自旋队列是否比传统队列更高效。此外,也想探索如何调优ReentrantLock的公平性参数,以最大化多线程应用的性能。

综上所述,我需要系统地去阅读ReentrantLock的实现细节,并结合实例来理解它在实际开发中的行为。希望通过深入的分析,我能够更好地利用这些锁来提升我的多线程编程能力。

转载地址:http://owhoz.baihongyu.com/

你可能感兴趣的文章
kafka+storm+hbase整合试验(Wordcount)
查看>>
VMware克隆虚拟机后重启network失败
查看>>
Hbase压力测试
查看>>
在IDEA中用jdbc技术通过配置文件连接mysql数据库连接池
查看>>
StreamReader & StreamWriter
查看>>
C#中的类、方法和属性
查看>>
Python入门基础知识点讲解:输入和输出
查看>>
Python爬取清朝末年医书:《醉花窗医案》,看看病症情况
查看>>
Python爬虫训练:爬取酷燃网视频数据
查看>>
Python新一代数据可视化神器:Plotly动画展示
查看>>
Python数据分析入门(十九):绘制散点图
查看>>
大佬谈接口自动化,我是这样做测试框架开发的……
查看>>
Codeforces Round #699 (Div. 2) A B
查看>>
备受关注的区块链技术应用领域都有哪些?
查看>>
tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案
查看>>
【母函数初学,其他简便方法】Holding Bin-Laden Captive! hdoj 1085
查看>>
C++版浙大PAT乙级1069(20分)测试点3答案错误解决方法
查看>>
hive内部错误
查看>>
Error during export: Export job failed! sqoop遇到的错
查看>>
Error:scalac: bad option: '-make:transitive'
查看>>