synchronized和ReentrantLock的区别
synchronized和ReentrantLock是jdk中保证线程安全的两大常用手段,也是两大利器。那他俩有啥区别呢?或者各自的特定和使用场景怎么样的呢?
梳理他俩区别要从多个方面来分析,见如下表格。
synchronized | ReentrantLock | |
---|---|---|
实现层面 | Jvm c++实现 | Jdk java语言实现 |
是否自动解锁 | 是 | 否 |
是否可重入 | 是 | 是 |
是否公平 | 否 | 公平、非公平可选 |
详细解读
1. 实现层面
synchronized
是Java的一个关键字,可以修饰方法和代码块。从Jvm层面由C++实现。
ReentrantLock
是Jdk juc包下的一个类,以AQS (AbstractQueuedSynchronizer)
为基础实现,内部主要用到CAS
来保证原子性实现线程安全。
2. 是否自动解锁
synchronized
是自动解锁的,无需关心解锁过程。即使发生异常也会自动解锁。
ReentrantLock
需要开发者自己调用加锁与解锁方法,并且,解锁要放在 fina