StampedLock 比读写锁还要灵活、还要快的锁

public class NumSumTst {
    private static Logger log = Logger.getLogger(NumSumTst.class.getName());

    private static final StampedLock lock = new StampedLock();

    private static int num1 = 1;

    private static int num2 = 1;

    private static int sum() {
        log.info("求和方法执行了");
        long stamp = lock.tryOptimisticRead();

        int cnum1 = num1;
        int cnum2 = num2;

        log.info("获取到的成员变量值, cnum1 " + cnum1 + "     cnum2 " + cnum2);
        try {
            Thread.sleep(3000);
        } catch (Exception e) {}

        if (!lock.validate(stamp)) {
            log.info("存在写操作");
            stamp = lock.readLock();
            try {
                log.info("升级悲观读锁");
                cnum1 = num1;
                cnum2 = num2;
                log.info("重新获取到了成员变量值+============ cnum1 " + cnum1 + "     cnum2  " + cnum2);
            } finally {
                lock.unlock(stamp);
            }
        }

        return cnum1 + cnum2;
    }

    private static void updateNum() {
        long stamp = lock.writeLock();
        try {
            num1 = 2;
            num2 = 2;
        } finally {
            lock.unlock(stamp);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            int sum = sum();
            log.info("求和结果" + sum);
        });
        t1.start();

        Thread.sleep(1000);
        updateNum();
        t1.join();
        log.info("执行完毕");
    }
}

以上就是简单的例子;

  • StampedLock与读写锁的区别就是  unlock的时候,需要传入lock返回的long值
  • StampedLock比读写锁灵活的地方在于,读锁没有释放的时候;写锁还是可以获取成功的
  • StampedLock不支持重入
  • StampedLock适合读多写少的场景;否则不如Synchronized
  • StampedLock的悲观读锁、写锁不支持条件变量
  • 千万不能中断阻塞的悲观读锁或写锁,如果调用阻塞线程的interrupt(),会导致cpu飙升,如果希望StampedLock支持中断操作,需要使用readLockInterruptibly     writeLockInterruptibly
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值