Java多线程--重入锁的实现原理
来源:互联网 发布:js数组去重系统方法 编辑:程序博客网 时间:2024/06/05 10:45
ReentrantLock 是一种支持支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁,除此之外,该锁还支持获取锁的公平性和非公平性选择。
1 重入的实现
对于锁的重入,我们来想这样一个场景。当一个递归方法被sychronized关键字修饰时,在调用方法时显然没有发生问题,执行线程获取了锁之后仍能连续多次地获得该锁,也就是说sychronized关键字支持锁的重入。对于ReentrantLock,虽然没有像sychronized那样隐式地支持重入,但在调用lock()方法时,已经获取到锁的线程,能够再次调用lock()方法获取锁而不被阻塞。
如果想要实现锁的重入,至少要解决一下两个问题
- 线程再次获取锁:锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。
- 锁的最终释放:线程重复n次获取了锁,随后在n次释放该锁后,其他线程能够获取该锁。锁的最终释放要求锁对于获取进行计数自增,计数表示当前锁被重复获取的次数,而锁被释放时,计数自减,当计数等于0时表示锁已经释放
(1) 锁的获取
下面来看看非公平锁的重入实现,它的实现在自定义同步器Sync内部nonfairTryAcquire方法
该方法通过当前线程是否为获取锁的线程来决定获取操作是否成功,如果是获取锁的线程再次请求,则将同步状态值进行增加并返回true,表示获取同步状态成功。
(2)锁的释放
现在来看看锁的释放,它同样是定义在自定义同步器Sync内
如果该锁被获取了n次,那么前(n-1)次tryRelease方法必须返回false,而只有同步状态完全释放了,才能返回true。可以看出,该方法只有在同步状态为0的时候才会返回true,并将占有线程设置为null,表示释放成功。
2 公平锁的实现
所有公平性,就是在绝对时间上,先对锁进行获取的请求一定先被满足。也就是等待时间最长的线程最优先获取锁
公平锁的实现在同步器FairSync内
这个方法就是在判断同步队列中当前节点是否有前驱节点,如果有则返回true,则表示有线程比当前线程更早地请求获取锁,因此需要等待前驱线程获取并释放锁之后才能继续获取锁。 由此就实现了公平锁。
阅读全文
0 0
- Java多线程--重入锁的实现原理
- Java多线程--Volatile的实现原理
- Java 多线程:InheritableThreadLocal 实现原理
- Java 多线程:InheritableThreadLocal 实现原理
- Java 多线程:InheritableThreadLocal 实现原理
- 【Java多线程】ThreadLocal实现原理
- Java多线程----Java 线程池的原理与实现
- Java多线程----Java 线程池的原理与实现
- java多线程总结五:线程池的原理及实现
- java多线程总结五:线程池的原理及实现
- Java实现基于数值编码原理的组合算法(多线程)
- java多线程总结五:线程池的原理及实现
- java多线程总结五:线程池的原理及实现
- java多线程总结之:线程池的原理及实现
- java多线程 :线程池的原理及实现
- java多线程总结五:线程池的原理及实现
- Java 多线程:分析线程池的实现原理
- java多线程总结五:线程池的原理及实现
- HDU 2015 偶数求和
- java 实现 计算tfidf 使用ik分词
- Java代理模式
- CCF-CSP认证题201703-3 Markdown
- Cordova 开发之安卓插件开发(二)
- Java多线程--重入锁的实现原理
- Solrj的增删改查,高亮,及分页
- 实训经历
- H5基础(6)-HTML5本地存储和本地数据库
- Split Array Largest Sum
- 杂谈
- HDU 2016 数据的交换输出
- 三菱V3菱悦智能遥控匹配详细的(两种)方法 配钥匙
- Netty in action—Netty中的ByteBuf