• 中文
    • English
  • 注册
  • 查看作者
  • JAVA concurrency — ReentrantLock 源码详解

    概述

    在jdk中内置了可重入锁
    来维护代码的同步,但是
    是在虚拟机层面实现,并且功能比较少,难以满足一些特殊的情况,所以在
    包中就有了类似的方法
    。今天我们就一起来分析下
    的源码实现。

    基本结构

    实际上我们仔细阅读源码后发现
    的实现很简单。他实现了接口
    ,但是他的同步实现实际上是在内部声明了一个叫
    的类来实现的,而
    是继承自同步器的核心类

    Sync

    实际上
    的核心全部在
    之上,所以我们重点来研究它。

    是一个声明在
    内部的抽象类,他继承了
    ,然后内部有两个类继承了
    ,一个是公平锁
    ,一个是非公平锁
    。这两个类对应了两个锁的不同实现。

    Sync实现

    Sync的内部方法如下

    上述代码我们可以看到Sync内部除了实现了AQS的一些基本的方法之外有两个非常重要的方法,一个是
    ,另一个是

    代码不难懂,主要是这个

    的值代表的意思是什么。
    是一个代表锁状态的值,如果为0,则说明锁是空闲可以被获取的,如果大于0则说明锁正在被占用。
    是可重入锁就体现在此,每一次获取锁,state的值便会加1,释放的时候也是可以按照需求批量释放,直到state的值变成0,则说明锁完全释放。

    依然是清晰明了的代码,我们可以很清楚的看到当发现当前线程是持有锁的线程时我们可以反复多次的获取锁,只需要将
    加上相应的值便可。这个方法是非公平获取锁,非公平体现在第一次判断上,如果是公平锁的话讲究先来后到,如果发现锁不空闲,应该放到队列中等待,但是他在发现锁不为空闲的时候,首先尝试了一次获取锁(尝试插队),发现获取失败才会老老实实在队列中等待。

    NonfairSync实现

    FairSync实现

    总结

    的实现非常的简单,因为同步器的核心实现是在
    中的,所以在
    中我们能够涉及到的无非就是可重入锁的实现以及公平锁非公平锁的区分。

  • 0
  • 0
  • 0
  • 24
  • 请登录之后再进行评论

    登录
  • 任务
  • 实时动态
  • 发布
  • 单栏布局 侧栏位置: