Java 中的锁

2025年5月12日 | 阅读 5 分钟

在 Java 中,LockJava.util.concurrent.locks 包中的一个接口。Java Lock 作为线程同步机制,与 synchronized 块类似。一段时间后,引入了一种新的锁定机制。它非常灵活,比 Synchronized 块提供了更多的选项。

以下是 Synchronized 块和 Lock 之间的一些区别:

序号因素Synchronized 块Lock
1.顺序保证它不保证等待线程访问的顺序。与 Synchronized 块不同,Lock 接口处理了这个问题。
2.无超时在未授予锁时,它没有时间选项。Lock 接口在授予锁时提供了这些选项。
3.单一方法它可以包含在一个方法中。接口的 lock() 和 unlock() 方法可以在不同的方法中调用。

在 Java 中,Lock 接口基本上提供了六种方法,如下所示:

lock() 方法

lock() 方法是 Lock 接口中最重要的方法之一。它用于获取锁。对于线程调度目的,当锁不可用时,当前线程将被禁用。lock() 方法是一个返回 void 的公共方法。

语法

注意:锁实现可用于查找锁的错误使用。在我们的代码中,调用可能会导致死锁并抛出未经检查的异常。

lockInterruptibly() 方法

lockInterruptibly() 方法是 Lock 接口的另一个重要方法,用于获取锁,除非当前线程被中断。如果锁可用,它会立即获取并返回锁。与 lock() 方法一样,只有在锁不可用时,当前线程才会被禁用线程调度。此时,线程将保持空闲状态,直到获得锁或另一个线程中断当前线程。

当当前线程在获取锁时被中断时,它会抛出 InterruptedException

lockInterruptibly() 方法是一个返回 void 且不带参数的公共方法。

语法

tryLock() 方法

tryLock() 方法主要在调用时用于获取锁。如果锁可用,它会立即以布尔值 true 返回锁。如果锁不可用,它将返回布尔值 false。

tryLock() 方法不带参数,并返回一个布尔值。

语法

我们使用 tryLock() 方法如下:

tryLock(long time, TimeUnit unit) 方法

它是 tryLock() 方法的另一个变体,用于在以下情况下获取锁:

  1. 在给定的等待时间内,锁将被释放。
  2. 当前线程不会被中断。

如果锁可用,它将立即获取并返回锁。与 lock() 方法一样,只有在锁不可用时,当前线程才会被禁用线程调度。此时,线程将保持空闲状态,直到当前线程获得锁。其他线程不会中断当前线程,或者指定的等待时间会过去。

语法

参数

time: time 参数定义了等待锁的最大时间。

unit: unit 参数定义了 time 参数的时间单位。

注意:当当前线程在获取锁时被中断时,tryLock(long time, TimeUnit unit) 会抛出 InterruptedExeption。

unlock() 方法

unlock() 方法是另一个最常用的方法,用于释放锁。unlock() 方法是一个公共方法,不返回任何值,也不带任何参数。

语法

newCondition() 方法

newCondition() 方法用于获取一个与此 Lock 实例绑定的新 Condition 实例。

在等待条件之前,必须由当前线程持有锁。调用 condition.wait() 将在等待之前原子地释放锁,并在等待返回之前重新获取锁。

语法

注意:当锁实现不支持条件时,newCondition() 会抛出 UnsupportedOperationExeption。

LockExample.java

输出

Lock in Java