stamplock的相比于readwritelock的乐观锁加强以及它的重入为何不允许

本文探讨了StampLock作为ReadWriteLock的加强版,特别是其读锁从悲观锁转变为乐观锁的特性。通过分析源码,解释了StampLock如何实现读写操作,并详细阐述了为何不允许重入的原因。文章通过关键代码片段展示了StampLock在读写切换、读锁升级等过程中的逻辑,帮助读者理解其内部工作机制。

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

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
stampLock的大致功能预计他的读锁源码解析


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

前不久和朋友讨论了一波stamplock的功能以及他的锁重入问题;于是乎跟他一起看起了源码;很折磨!!!


提示:以下是本篇文章正文内容,下面案例可供参考

一、stampLock是什么?以及其中的重要常量

stampLock其实可以简单地看成readWriteLock的一种加强
对于读锁的加强,他的读锁从原本的悲观锁变成了读锁。

要读懂源码 首先要把代码中的常用变量给理解清楚 并大概的记下来 才容易理解源码内容
废话不多看源码

引用的关键值

//类序列号
 private static final long serialVersionUID = -6001602636862214147L;

    /** 程序的序列号, 用来cpu线程循环的控制 */
    private static final int NCPU = Runtime.getRuntime().availableProcessors();

    /** 最大的队列询问重试值2^6; ncpu为程序设置的cpu线程数;at least 1 */
    private static final int SPINS = (NCPU > 1) ? 1 << 6 : 1;

    /** 最大的阻塞队列头重试值;至少为1;最大为1^16*/
    private static final int HEAD_SPINS = (NCPU > 1) ? 1 << 10 : 1;

    /** 最大的在重新阻塞时重试值 */
    private static final int MAX_HEAD_SPINS = (NCPU > 1) ? 1 << 16 : 1;

    /** 当等待的自旋锁栈溢出时主要的yielding */
    private static final int OVERFLOW_YIELD_RATE = 7; // must be power 2 - 1

    /**被自旋读卡器栈溢出前所使用的字节数 */
    private static final int LG_READERS = 7;

    // Values for lock state and stamp operations
    private static final long RUNIT = 1L;
    private static final long WBIT  = 1L << LG_READERS;
    private static final long RBITS = WBIT - 1L;
    private static final long RFULL = RBITS - 1L;
    private static final long ABITS = RBITS | WBIT;
    private static final long SBITS = ~RBITS; // note overlap with ABITS

    /*
     * 通过测试有三种stamp的模式能够被分辨出来 
     * (m = stamp & ABITS):write mode: m == WBIT
     * 乐观锁的模式: m == 0L (甚至乐观锁被持有的时候)
     * 读模式: m > 0L && m <= RFULL (stamp是state的复制 也就是说这里的stamp是用来计算的 而state是用来获取值的
     * 但是read在stamp中持有的数量是未被用于其他确认模式的
     *
     * 这个轻微的差别在于state的解码:
     * (state & ABITS) == 0L 显示该锁当前是未上锁的
     * (state & ABITS) == RBITS 一个特殊的显示值
     * 指示自旋锁定以操纵读卡器位溢出
     */

    /** 初始化state的初始值;避免0失效值. */
    private static final long ORIGIN = WBIT << 1;

    // 来自取消需求方法的特殊值 一边响应者可以返回IE(ioexception)
    private static final long INTERRUPTED = 1L;

    // 状态标记的值 
    private static final int WAITING   = -1;
    private static final int CANCELLED =  1;

    // 标记的模式  是int类型而不是boolean类型去允许计算的
    private static final int RMODE = 0;
    private static final int WMODE = 1;

    /** 等待点 */
    static final class WNode {
   
   
        volatile WNode prev;
        volatile WNode next;
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值