博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ReentrantLock
阅读量:6250 次
发布时间:2019-06-22

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

ReenTrantLock可重入锁(和synchronized的区别)总结

 

重入性: ReenTrantLock和synchronized都是可重入锁。 同一个线程每进入一次,锁的计数器+1,等到锁的计数器降为0时才释放锁。

实现:    Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的。

写法:    Synchronized由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。

锁类型: ReenTrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁。

ReenTrantLock提供了一个Condition(条件)类,用来实现分组唤醒需要唤醒的线程们,而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。

 

final Lock lock = new ReentrantLock();//锁对象final Condition notFull  = lock.newCondition();//写线程条件 final Condition notEmpty = lock.newCondition();//读线程条件    lock.lock(); try {    notFull.await();//阻塞写线程    //.......    notEmpty.signal();//唤醒读线程 } finally {    lock.unlock(); }

 

 

Object的                                 wait   notify   notifyAll    FIFO

ReentrantLock 的condition的 await signal  signalAll

 

ReentrantLock主要利用CAS+CLH队列来实现。

CAS:       Compare and Swap,比较并交换。CAS有3个操作数:内存值V、预期值A、要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。该操作是一个原子操作,被广泛的应用在Java的底层实现中。在Java中,CAS主要是由sun.misc.Unsafe这个类通过JNI调用CPU底层指令实现。

CLH队列:带头结点的双向非循环链表

/** * 该锁同步控制的一个基类.下边有两个子类:非公平机制和公平机制.使用了AbstractQueuedSynchronizer类的 */static abstract class Sync extends AbstractQueuedSynchronizer (AQS)/** * 非公平锁同步器 */final static class NonfairSync extends Sync/** * 公平锁同步器 */final static class FairSync extends Sync   /** 同步器:内部类Sync的一个引用 */private final Sync sync;/** * 创建一个锁 * @param fair true-->公平锁  false-->非公平锁 */public ReentrantLock(boolean fair) {    sync = (fair)? new FairSync() : new NonfairSync();}

 

 

 

参考  https://blog.csdn.net/qq838642798/article/details/65441415

转载于:https://www.cnblogs.com/webglcn/p/10626801.html

你可能感兴趣的文章
2018年最值得关注的30个Vue开源项目
查看>>
docker之DockerSwarm的了解
查看>>
大区块的BCH给智能合约更大的发展潜力
查看>>
springcloud(五):熔断监控Hystrix Dashboard
查看>>
七年软件测试历程,回过头来,最能帮助我的还是这些.....
查看>>
yum 安装nginx
查看>>
前端(js+JQuery非空校验)
查看>>
[Android] ImageView.ScaleType设置图解
查看>>
银行卡卡号验证
查看>>
VS的内存断点
查看>>
Jenkins实战演练之Linux系统节点管理
查看>>
为什么init脚本需要lock文件
查看>>
利用python的zmail模块发送邮件
查看>>
DIY-希捷硬盘固件问题的解决方法
查看>>
有关电脑不能上网的检查方法
查看>>
我的友情链接
查看>>
Spring5最新源码导入Eclipse详解
查看>>
Linux 基础学习
查看>>
我的友情链接
查看>>
js之拖动节点放置链路上
查看>>