Java源码-Lock接口

125 阅读2分钟
  • 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

Lock所在位置

都知道lock是java轻量级的锁,我们首先看一下lock的所在包位置,源码里Lock的package为

java.util.concurrent.locks

Lock所在在JUC下的包内,同级目录locks下还有如下类

截屏2022-06-14 下午11.35.12.png 其他类我们先不管,我们先看Lock接口

Lock类图

截屏2022-06-14 下午11.36.47.png

lock的类图只有它这一个接口,没有其他继承跟实现的关系,说明这是一个顶级接口,从上往下走更方便我们熟悉整个locks内容下的规则跟实现

Lock的方法

在源码内查看Lock这个顶级接口定义了哪些方法来规定了整个锁机制的大框架

截屏2022-06-14 下午11.40.20.png

Lock接口内定义了6个方法,简单介绍各项作用:

  • lock:获取锁。如果锁不可用,则当前线程将被禁用以用于线程调度目的并处于休眠状态,直到获得锁为止。实现注意事项 Lock 实现可能能够检测到锁的错误使用,例如会导致死锁的调用,并且在这种情况下可能会抛出(未经检查的)异常。该锁实现必须记录情况和异常类型。

  • lockInterruptibly:允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回,这时不用获取锁,而会抛出一个InterruptedException。

  • tryLock:仅当调用时它是空闲的时才获取锁。如果锁可用,则获取锁,并立即返回值为 true。如果锁不可用,则此方法将立即返回值为 false。

  • tryLock(long time, TimeUnit unit):如果在给定的等待时间内空闲并且当前线程没有被中断,则获取锁。如果锁可用,则此方法立即返回值 true。如果锁不可用,则当前线程将被禁用以用于线程调度目的并处于休眠状态,直到发生以下三种情况之一:

    • 锁被当前线程获取;
    • 其他一些线程中断当前线程,支持中断获取锁
    • 指定的等待时间已过
  • unlock:释放锁。实现注意事项 Lock 实现通常会限制哪个线程可以释放锁(通常只有锁的持有者可以释放它),如果违反限制,可能会抛出(未经检查的)异常。该 Lock 实现必须记录任何限制和异常类型。

  • newCondition:返回绑定到此 Lock 实例的新 Condition 实例。在等待条件之前,锁必须由当前线程持有。调用 Condition.await() 将在等待之前自动释放锁,并在等待返回之前重新获取锁。

Lock的实现类

一下就是之间实现Lock接口的实现类

截屏2022-06-14 下午11.56.06.png