ReentrantLock和Synchronized的区别
- 核心区别
ReentrantLock是一个类,Synchronized是Java中的一个关键字。
两者都是JVM层面实现互斥锁的方式
- 效率区别
线程竞争激烈推荐使用ReentrantLock去实现,不存在锁竞争观念;
Synchronized是存在锁升级,但是并不存在锁降级
- 底层实现区别
这里是引用
ReentrantLock是基于AQS实现
Synchronized是基于ObjectMonitor,c++来实现的
- 功能性的区别
ReentrantLock的功能比Synchronized更加全面
ReentrantLock能支持公平锁和非公平锁;也能支持指定等待资源的时间
/*** @author 舒一笑* @date 2023/5/28*/
public class Test16 {ReentrantLock lock = new ReentrantLock(false);//非公平锁ReentrantLock lock2 = new ReentrantLock(true);//公平锁public static synchronized void main(String[] args) {}
}
什么是AQS
AQSz值的便是下面这个抽象类,他是JUC包下的基类。JUC下很多内容都是基于AQS去实现的部分功能,比如ReentrantLock,ThreadPoolExecutor,阻塞队列,CountDownLatch,Semaphore,CyclicBarrier等等。
AQS的特点
- AQS中提供了一个由volatile修饰的,采用CAS方式修改的int类型的static变量。
- AQS维护了一个由head、tail、并且每个节点都是Node对象的双向链表