17、带超时机制的队列锁及复合锁详解

带超时机制的队列锁及复合锁详解

1. 带超时机制的队列锁(TOLock)

1.1 超时机制概述

在 Java 的 Lock 接口中, tryLock() 方法允许调用者指定一个超时时间,即调用者愿意等待获取锁的最长时间。若在超时时间内未获取到锁,尝试将被放弃,该方法会返回一个布尔值来指示锁获取是否成功。

对于 BackoffLock 请求,放弃请求很简单,线程只需从 tryLock() 调用中返回即可,且超时操作是无等待的,仅需常数步。然而,队列锁算法的超时处理则复杂得多,若线程直接返回,其后续排队的线程将陷入饥饿状态。

1.2 TOLock 实现思路

TOLock 基于 CLHLock 实现,是一个支持超时机制的队列锁。它采用虚拟节点队列,每个线程会在其前驱节点上自旋,等待锁的释放。当线程超时时,不能直接放弃其队列节点,因为其后继者将无法得知锁已释放。因此,TOLock 采用了一种懒处理方式:线程超时时,将其节点标记为已放弃,队列中的后继者若发现其自旋的节点已被放弃,便会开始在前驱节点的前驱节点上自旋,同时还能回收被放弃的节点。

1.3 TOLock 代码实现

1.3.1 类定义及字段
public class TOLock implements Lock{
    static QNode AVAILABLE = new QNode();
    AtomicReference<Q
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值