Java中ReentrantLock的概念深入理解

245 阅读1分钟

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对象的双向链表 在这里插入图片描述

结构的示意图

在这里插入图片描述