深圳网站建设价格,百度推广的渠道有哪些,西安做网站的公司排名,网站设计公司 深圳龙华可重入性#xff1a;
从名字上理解#xff0c;ReenTrantLock的字面意思就是再进入的锁#xff0c;其实synchronized关键字所使用的锁也是可重入的#xff0c;两者关于这个的区别不大。两者都是同一个线程没进入一次#xff0c;锁的计数器都自增1#xff0c;所以要等到锁…可重入性
从名字上理解ReenTrantLock的字面意思就是再进入的锁其实synchronized关键字所使用的锁也是可重入的两者关于这个的区别不大。两者都是同一个线程没进入一次锁的计数器都自增1所以要等到锁的计数器下降为0时才能释放锁。 锁的实现
Synchronized是依赖于JVM实现的而ReenTrantLock是JDK实现的有什么区别说白了就类似于操作系统来控制实现和用户自己敲代码实现的区别。前者的实现是比较难见到的后者有直接的源码可供阅读。 性能的区别
在Synchronized优化以前synchronized的性能是比ReenTrantLock差很多的但是自从Synchronized引入了偏向锁轻量级锁自旋锁后两者的性能就差不多了在两种方法都可用的情况下官方甚至建议使用synchronized其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。都是试图在用户态就把加锁问题解决避免进入内核态的线程阻塞。 功能区别
便利性很明显Synchronized的使用比较方便简洁并且由编译器去保证锁的加锁和释放而ReenTrantLock需要手工声明来加锁和释放锁为了避免忘记手工释放锁造成死锁所以最好在finally中声明释放锁。
锁的细粒度和灵活度很明显ReenTrantLock优于Synchronized ReenTrantLock独有的能力
1. ReenTrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁。
2. ReenTrantLock提供了一个Condition条件类用来实现分组唤醒需要唤醒的线程们而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。
3. ReenTrantLock提供了一种能够中断等待锁的线程的机制通过lock.lockInterruptibly()来实现这个机制。 ReenTrantLock实现的原理
在网上看到相关的源码分析本来这块应该是本文的核心但是感觉比较复杂就不一一详解了简单来说ReenTrantLock的实现是一种自旋锁通过循环调用CAS操作来实现加锁。它的性能比较好也是因为避免了使线程进入内核态的阻塞状态。想尽办法避免线程进入内核的阻塞状态是我们去分析和理解锁设计的关键钥匙。 什么情况下使用ReenTrantLock
答案是如果你需要实现ReenTrantLock的三个独有功能时。