💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
ReenTrantLock: 可重入锁 1. Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的 2. jdk1.6 对Synchronized做了优化,引入了偏向锁,轻量级锁(自旋锁)后,两者性能差不多 3. 在两种方法都可用的情况下,官方甚至建议使用synchronized 4. 区别:某些场合只能用 ReenTrantLock,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的三个独有功能时 #### PS ReenTrantLock 和 synchronized都是可重入锁。 synchronized的锁是非公平锁,ReentrantLock默认情况下也是非公平锁,但可以通过带布尔值的构造函数要求使用公平锁。 锁绑定多个条件的区别 ### 参考 [synchronized和锁(ReentrantLock) 区别](https://blog.csdn.net/zheng548/article/details/54426947)