20230607 java.util.concurrent.locks.Lock

发布时间 2023-08-30 17:22:01作者: 流星<。)#)))≦

介绍

  • java.util.concurrent.locks.Lock
  • public interface Lock
  • Lock 实现提供比使用 synchronized 更广泛的锁定操作。 它们允许更灵活的结构化,可能具有完全不同的属性,并且可以支持多个相关联的 Condition 对象
  • 请注意, Lock 实例只是普通对象,它们本身可以用作 synchronized 语句中的目标。 获取 Lock 实例的监视器锁与调用该实例的任何 lock() 方法没有特定关系。 建议为避免混淆,您不要以这种方式使用Lock实例,除了在自己的实现中
  • 所有Lock实现都必须强制执行与内置监视器锁提供的相同内存同步语义
    • 成功的lock操作与成功的锁定操作具有相同的内存同步效果
    • 成功的unlock操作与成功的解锁操作具有相同的内存同步效果
    • 不成功的加锁和解锁操作,以及可重入的加锁/解锁操作,不需要任何内存同步效果
  • 锁获取的三种形式(可中断、不可中断和定时)在性能特征、顺序保证或其他实现质量方面可能有所不同。此外,中断正在进行的锁获取的能力在给定的Lock类中可能不可用。因此,实现不需要为所有三种形式的锁获取定义完全相同的保证或语义,也不需要支持中断正在进行的锁获取。
  • 实现类
    • java.util.concurrent.locks.ReentrantLock
    • java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock
    • java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock

API

  • lock
    • void lock();
    • 获取锁
    • 获取失败会阻塞当前线程
  • lockInterruptibly
    • void lockInterruptibly() throws InterruptedException;
    • 获取锁
    • 获取失败会阻塞当前线程,但可以被中断
  • tryLock
    • boolean tryLock();
      • 尝试获取锁,获取成功返回true,获取失败返回false
      • 该方法不会阻塞线程
    • boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
      • 如果在给定的等待时间内有空闲并且当前线程没有被中断,则获取锁,返回true
      • 如果指定的等待时间过去,则返回值false。如果时间小于或等于零,则该方法不会等待
  • unlock
    • void unlock();
    • 释放锁
  • newCondition
    • Condition newCondition();
    • 返回绑定到此 Lock 实例的新 Condition 实例