juc锁之StampedLock

该类自JDK8加入。是为了进一步优化读性能,它的特点是在使用读锁、写锁时都必须配合【戳】使用

加解读锁

StampedLock stampedLock = new StampedLock();
long stamped = stampedLock.readLock();

加解写锁

StampedLock stampedLock = new StampedLock();
long stamped = stampedLock.writeLock();

乐观读

StampedLock支持tryoptimisticRead()方法(乐观读),读取完毕后需要做一次戳校验如果校验通过,表示这期间确实没有写操作,数据可以安全使用,如果校验没通过,需要重新获取读锁,保证数据安全。

// 尝试无锁读
        long stamped = stampedLock.tryOptimisticRead();
public int read(){
        // 尝试无锁读
        long stamped = stampedLock.tryOptimisticRead();
        if (stampedLock.validate(stamped)){
            System.out.println("验戳成功...");
            return data;
        }
        // 验戳失败,无锁读失败,需要锁升级为读锁
        try {
            stamped = stampedLock.readLock();
            return data;
        }finally {
            stampedLock.unlockRead(stamped);
        }
    }

StampedLock的特点

  • 通过比较戳的方式来判断是否有写操作破坏数据一致性,如果没有写操作则不需要升级为读锁,从而提升性能
  • StampedLock不支持条件变量(即不支持newCondition()  无法使用await()等操作)
  • StampedLock不支持重入不是重入锁(ReentrantLock支持重入;ReentrantReadWriteLock支持向下兼容的重入,即写锁可以重入读锁,读锁不能重入写锁需要先解锁)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值