• 重入锁ReentrantLock详解


    重入锁ReentrantLock详解 

       ReentrantLock 实现自AQS队列同步器,其字面意思是可以重复进入的锁,其功能也如其名,在一个同步代码块中,可以多次调用 lock() 进行上锁,当然也需要对其进行多次解锁,才能使同步状态归0,其它线程才能重新获得锁。

      重入锁又分为非公平锁和公平锁两种实现,默认实现为非公平锁,要实现公平锁,在new对象时在构造参数中传入参数true即可。非公平锁上锁过程不会管先后顺序,谁先更新到同步状态谁就获得了锁。而公平锁会根据上锁的顺序,将线程放入队列中,依次执行。从效率上讲公平锁消耗更多资源,因为它要协调这种先后执行顺序。

    一、非公平锁

      1.非公平锁上锁

       高清图被浏览器压缩了,有些变糊了。可以复制下载下来看。

      总结:

      (1)非公平重入锁首先尝试CAS更新同步状态,即抢锁;

      (2)抢锁失败会先调用非公平锁重写的tryAcquire方法,如果当前同步状态为0,那么也尝试CAS更新同步状态进行抢锁;

      (3)如果同步状态不为0,则判断是否是当前线程重复上锁

      (4)还是失败,则进入队列,在当前节点的前置节点为头节点时,开始尝试抢锁;

      (5)抢锁成功,完

    二、非公平锁

      1.上锁

      代码的区别如下,就在hasQueuedPredecessors方法,此方法判断当前线程是否有前置的线程节点在等待,有则继续自旋或等待,没有则进行CAS更新同步状态抢锁

  • 相关阅读:
    JQury RadioButton
    Oracle 错误
    C#基础 ASP.NET基本技巧
    后台管理系统框架模版(静态页)
    复习串讲 day02:搭建邮件服务、空客户端、搭建数据库服务、数据库基础操作
    ENGINEER 004:Linux命令字的来源、alias别名设置
    ENGINEER 003:配置IPv6地址
    ENGINEER 002: 配置用户环境 --- 配置聚合连接
    ENGINEER 001:SELinux安全机制
    命令行基础
  • 原文地址:https://www.cnblogs.com/lcmlyj/p/14010607.html
Copyright © 2020-2023  润新知