ReentrantLock可重入锁原理解析

 更新时间:2023年10月27日 09:24:25   作者:lane  
这篇文章主要为大家介绍了ReentrantLock可重入锁原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

ReentrantLock 可重入锁

字面意思理解为同一线程可以重入加锁

内部主要逻辑继承AQS来实现的,有两种实现FairSycn、NonfairSync,公平锁和非公平锁,默认为非公平锁。

  • 公平锁:保证先入队的先获得锁。
  • 非公平锁:不保证先入队的先获得锁,可能后面的线程先抢到锁。

主要实现流程

CAS全名compare and swap比较交换,由native方法提供的系统原子性操作,以保证并发发安全性。

公平锁的实现

加锁

//加锁
final void lock() {
  acquire(1);//调用AQS方法
}
//AQS方法
public final void acquire(int arg) {
  if (!tryAcquire(arg) &&//尝试获取锁,抽象方法由子类实现
      acquireQueued(addWaiter(Node.EXCLUSIVE), arg))    
      /* addWaiter 将线程加入等待队列
       * acquireQueued 尝试获取锁、阻塞
       */
  {
      //中断
      selfInterrupt();
  }
}
//尝试获取锁
protected final boolean tryAcquire(int acquires) {
  //获取当前线程
  final Thread current = Thread.currentThread();
  int c = getState();//获取state值,AQS属性volatile标记
  if (c == 0) {//锁空闲状态
      if (!hasQueuedPredecessors() &&//是否需要排队
          compareAndSetState(0, acquires)) {//获取锁
          setExclusiveOwnerThread(current);//成功获取,设置锁owner为当前线程
          return true;//后续不在处理
      }
  }
  else if (current == getExclusiveOwnerThread()) {//当前线程已持有锁,重入
      int nextc = c + acquires;//state+1
      if (nextc < 0)
          throw new Error("Maximum lock count exceeded");
      setState(nextc);//已持有锁,直接设置state值
      return true;
  }
  return false;
}

解锁

//解锁,ReentrantLock方法
public void unlock() {
  sync.release(1);//AQS方法
}
//AQS解锁
public final boolean release(int arg) {
  if (tryRelease(arg)) {//尝试解锁
      Node h = head;
      if (h != null && h.waitStatus != 0)//waitStatus=0时不进行unpark(唤醒),next线程可能中断
          unparkSuccessor(h);//唤醒队列中的线程去获取锁
      return true;
  }
  return false;
}
//尝试解锁ReentrantLock内部静态类Sync实现
protected final boolean tryRelease(int releases) {
  int c = getState() - releases;//state-1
  if (Thread.currentThread() != getExclusiveOwnerThread())
      throw new IllegalMonitorStateException();//非持有锁的线程进行释放,非法操作
  boolean free = false;
  if (c == 0) {//持有锁线程全部释放
      free = true;
      setExclusiveOwnerThread(null);//持有锁线程置空
  }
  setState(c);//持有锁线程直接设置state
  return free;
}

非公平锁的实现

非公平锁和公平锁的核心区别是在尝试获取锁方法tryAcquire实现中没有判断hasQueuedPredecessors()是否需要排队,其他逻辑和公平锁是一致的。

以上就是ReentrantLock可重入锁原理解析的详细内容,更多关于ReentrantLock可重入锁的资料请关注脚本之家其它相关文章!

相关文章

  • Java中的位运算符、移位运算详细介绍

    Java中的位运算符、移位运算详细介绍

    这篇文章主要介绍了Java中的位运算符、移位运算,有需要的朋友可以参考一下
    2013-12-12
  • Mybatis如何分割字符串

    Mybatis如何分割字符串

    这篇文章主要介绍了Mybatis如何分割字符串问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java各种锁在工作中使用场景和细节经验总结

    Java各种锁在工作中使用场景和细节经验总结

    本章主要说一说锁在工作中的使用场景,主要以 synchronized 和 CountDownLatch 为例,会分别描述一下这两种锁的使用场景和姿势
    2022-03-03
  • SpringCloud全面解析@FeignClient标识接口的过程

    SpringCloud全面解析@FeignClient标识接口的过程

    这篇文章主要介绍了SpringCloud全面解析@FeignClient标识接口的过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java设计模式以虹猫蓝兔的故事讲解桥接模式

    Java设计模式以虹猫蓝兔的故事讲解桥接模式

    桥接是用于把抽象化与实现化解耦,使二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响
    2022-04-04
  • SpringBoot配置文件properties和yml的实现

    SpringBoot配置文件properties和yml的实现

    本文主要介绍了SpringBoot配置文件properties和yml的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • java文件操作工具类实现复制文件和文件合并

    java文件操作工具类实现复制文件和文件合并

    这篇文章主要介绍了java文件操作工具类,类实现了复制文件和文件合并的功能,需要的朋友可以参考下
    2014-03-03
  • Hadoop源码分析一架构关系简介

    Hadoop源码分析一架构关系简介

    本篇是Hadoop源码分析系列文章第一篇,主要介绍一下Hadoop的基础简介以及框架关系,后续本系列文章会持续更新,有需要的朋友可以借鉴参考下
    2021-09-09
  • SpringCloud超详细讲解微服务网关Zuul

    SpringCloud超详细讲解微服务网关Zuul

    这篇文章主要介绍了SpringCloud Zuul微服务网关,负载均衡,熔断和限流,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Java二维数组与稀疏数组相互转换实现详解

    Java二维数组与稀疏数组相互转换实现详解

    在某些应用场景中需要大量的二维数组来进行数据存储,但是二维数组中却有着大量的无用的位置占据着内存空间,稀疏数组就是为了优化二维数组,节省内存空间
    2022-09-09

最新评论