本文详细介绍了Java中的Lock接口及其实现,包括如何使用Lock提供的更广泛的锁定操作来控制多个线程对共享资源的访问。文章还讨论了Lock方法的详细信息,如获取锁、释放锁、尝试获取锁等,以及Lock实现中的一些注意事项,如检测错误使用并可能抛出异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public interface Lock
 

Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的Condition 对象。

锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。不过,某些锁可能允许对共享资源并发访问,如ReadWriteLock 的读取锁。 

方法详细信息

void lock()

获取锁。

如果锁不可用,出于线程调度目的,将禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态。

实现注意事项

Lock 实现可能能够检测到锁的错误使用,比如会导致死锁的调用,在那种环境下还可能抛出一个 (unchecked) 异常。Lock 实现必须对环境和异常类型进行记录。

void lockInterruptibly()
                       throws InterruptedException
如果当前线程未被 中断,则获取锁。

如果锁可用,则获取锁,并立即返回。

如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下两种情况之一以前,该线程将一直处于休眠状态:

  • 锁由当前线程获得;或者
  • 其他某个线程中断当前线程,并且支持对锁获取的中断。

如果当前线程:

  • 在进入此方法时已经设置了该线程的中断状态;或者
  • 在获取锁时被中断,并且支持对锁获取的中断,
则将抛出 InterruptedException,并清除当前线程的已中断状态。




boolean tryLock()
仅在调用时锁为空闲状态才获取该锁。

如果锁可用,则获取锁,并立即返回值 true。如果锁不可用,则此方法将立即返回值 false




boolean tryLock(long time,
                TimeUnit unit)
                throws InterruptedException
如果锁在给定的等待时间内空闲,并且当前线程未被 中断,则获取锁。

如果锁可用,则此方法将立即返回值 true。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下三种情况之一前,该线程将一直处于休眠状态:

  • 锁由当前线程获得;或者
  • 其他某个线程中断当前线程,并且支持对锁获取的中断;或者
  • 已超过指定的等待时间

如果获得了锁,则返回值 true

如果当前线程:

  • 在进入此方法时已经设置了该线程的中断状态;或者
  • 在获取锁时被中断,并且支持对锁获取的中断,
则将抛出 InterruptedException,并会清除当前线程的已中断状态。

如果超过了指定的等待时间,则将返回值 false。如果 time 小于等于 0,该方法将完全不等待。

参数:
time - 等待锁的最长时间

unit - time 参数的时间单位



void unlock()
释放锁。

实现注意事项

Lock 实现通常对哪个线程可以释放锁施加了限制(通常只有锁的保持者可以释放它),如果违背了这个限制,可能会抛出(未经检查的)异常。该Lock 实现必须对所有限制和异常类型进行记录。




Condition newCondition()
返回绑定到此 Lock 实例的新 Condition 实例。

在等待条件前,锁必须由当前线程保持。调用 Condition.await() 将在等待前以原子方式释放锁,并在等待返回前重新获取锁。

实现注意事项

Condition 实例的具体操作依赖于Lock 实现,并且该实现必须对此加以记录。



public class LockInfo
   
    extends Object
   
 

关于 的信息。锁可以是内置对象监视器、可拥有同步器 (ownable synchronizer) 或与同步器关联的 Condition 对象。

可拥有同步器是可以由一个线程独占的同步器,使用 AbstractOwnableSynchronizer(或其子类)来实现其同步属性。ReentrantLockReentrantReadWriteLock 是平台提供的两个可拥有同步器示例。 

public class LockSupport
   
    extends Object
   
 

用来创建锁和其他同步类的基本线程阻塞原语。

此类以及每个使用它的线程与一个许可关联(从 Semaphore 类的意义上说)。如果该许可可用,并且可在进程中使用,则调用 park 将立即返回;否则可能 阻塞。如果许可尚不可用,则可以调用 unpark 使其可用。(但与 Semaphore 不同的是,许可不能累积,并且最多只能有一个许可。) 


static ObjectgetBlocker(Thread t)
返回提供给最近一次尚未解除阻塞的 park 方法调用的 blocker 对象,如果该调用不受阻塞,则返回 null。
static voidpark()
为了线程调度,禁用当前线程,除非许可可用。
static voidpark(Object blocker)
为了线程调度,在许可可用之前禁用当前线程。
static voidparkNanos(long nanos)
为了线程调度禁用当前线程,最多等待指定的等待时间,除非许可可用。
static voidparkNanos(Object blocker, long nanos)
为了线程调度,在许可可用前禁用当前线程,并最多等待指定的等待时间。
static voidparkUntil(long deadline)
为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
static voidparkUntil(Object blocker, long deadline)
为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
static voidunpark(Thread thread)
如果给定线程的许可尚不可用,则使其可用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值