当前位置:首页 > 科技  > 软件

为什么StampedLock会导致CPU100%?

来源: 责编: 时间:2024-07-19 07:54:40 614观看
导读StampedLock 是 Java 8 引入的一种高级的锁机制,它位于 java.util.concurrent.locks 包中。与传统的读写锁(ReentrantReadWriteLock)相比,StampedLock 提供了更灵活和更高性能的锁解决方案,尤其适用于读操作远多于写操作的

a0B28资讯网——每日最新资讯28at.com

StampedLock 是 Java 8 引入的一种高级的锁机制,它位于 java.util.concurrent.locks 包中。与传统的读写锁(ReentrantReadWriteLock)相比,StampedLock 提供了更灵活和更高性能的锁解决方案,尤其适用于读操作远多于写操作的场景。a0B28资讯网——每日最新资讯28at.com

1.特点展示

相比于 Java 中的其他锁,StampedLock 具有以下特点:a0B28资讯网——每日最新资讯28at.com

  • 读写分离:StampedLock 支持读写分离,读锁和写锁可以同时被不同的线程持有,从而提高了并发性能。而 synchronized 和 ReentrantLock 则不支持读写分离,读操作和写操作会相互阻塞。
  • 乐观读:StampedLock 支持乐观读,读操作不会阻塞写操作,只有在写操作发生时才会升级为悲观读。这种方式适用于读多写少的场景,可以提高读操作的并发性能。而 ReentrantReadWriteLock 则不支持乐观读。
  • 不可重入:ReentrantLock 和 synchronized 都是可重入锁,而 StampedLock 的写锁是不可重入的。
  • 性能优势:StampedLock 在多线程并发中的读多情况下有更好的性能,因为 StampedLock 获取乐观读锁时,不需要通过 CAS 操作来设置锁的状态,只是简单地通过测试状态即可。

2.基本使用

StampedLock 有三种读写方法:a0B28资讯网——每日最新资讯28at.com

  • readLock():读锁,用于多线程并发读取共享资源。
  • writeLock():写锁,用于独占写入共享资源。
  • tryOptimisticRead():读乐观锁,用于在不阻塞其他线程的情况下尝试读取共享资源。

其中 readLock() 和 writeLock() 方法与 ReentrantReadWriteLock 的用法类似,而 tryOptimisticRead() 方法则是 StampedLock 引入的新方法,它用于非常短的读操作。a0B28资讯网——每日最新资讯28at.com

因此,我们在加锁时,可以使用性能更高的读乐观锁来替代传统的读锁,如果能加锁成功,则它可以和其他线程(即使是写操作)一起执行,也无需排队运行(传统读锁遇到写锁时需要排队执行),这样的话 StampedLock 的执行效率就会更高,它是使用如下:a0B28资讯网——每日最新资讯28at.com

// 创建 StampedLock 实例StampedLock lock = new StampedLock();// 获取乐观读锁long stamp = lock.tryOptimisticRead(); // 读取共享变量if (!lock.validate(stamp)) { // 检查乐观读锁是否有效    stamp = lock.readLock(); // 如果乐观读锁无效,则获取悲观读锁    try {        // 重新读取共享变量    } finally {        lock.unlockRead(stamp); // 释放悲观读锁    }}// 获取悲观读锁long stamp = lock.readLock(); try {    // 读取共享变量} finally {    lock.unlockRead(stamp); // 释放悲观读锁}// 获取写锁long stamp = lock.writeLock(); try {    // 写入共享变量} finally {    lock.unlockWrite(stamp); // 释放写锁}

使用乐观读锁的特性可以提高读操作的并发性能,适用于读多写少的场景。如果乐观读锁获取后,在读取共享变量前发生了写入操作,则 validate 方法会返回 false,此时需要转换为悲观读锁或写锁重新访问共享变量。a0B28资讯网——每日最新资讯28at.com

3.注意事项

在使用 StampedLock 时,需要注意以下几个问题:a0B28资讯网——每日最新资讯28at.com

  • 不可重入性:StampedLock 的读锁和写锁都不支持重入,这意味着一个线程在获取了锁之后,不能再次获取同一个锁,所以在使用 StampedLock 时,一定要避免嵌套使用。
  • 死锁问题:使用 StampedLock 时,必须使用与获取锁时相同的 stamp 来释放锁,否则就会导致释放锁失败,从而导致死锁问题的发生。
  • CPU 使用率飙升问题:如果 StampedLock 使用不当,具体来说,在 StampedLock 执行 writeLock 或 readLock 阻塞时,如果调用了中断操作,如 interrupt() 可能会导致 CPU 使用率飙升。这是因为线程接收到了中断请求,但 StampedLock 并没有正确处理中断信号,那么线程可能会陷入无限循环中,试图从中断状态中恢复,这可能会导致 CPU 使用率飙升。

4.CPU 100%问题演示

以下代码中线程 2 会导致 CPU 100% 的问题,如下代码所示:a0B28资讯网——每日最新资讯28at.com

public void runningTask() throws Exception{    final StampedLock lock = new StampedLock();    Thread thread = new Thread(()->{        // 获取写锁        lock.writeLock();        // 永远阻塞在此处,不释放写锁        LockSupport.park();    });    thread.start();    // 保证 thread 获取写锁    Thread.sleep(100);    Thread thread2 = new Thread(()->        // 阻塞在悲观读锁        lock.readLock()    );    thread2.start();    // 保证 thread2 阻塞在读锁    Thread.sleep(100);    // 中断线程 thread2,导致 thread2 CPU 飙升    thread2.interrupt();    thread2.join();}

以上代码中,线程一先获取到锁,之后阻塞,并未释放锁,而线程二阻塞在 readLock() 读锁时,收到了中断请求 interrupt(),但并未正确处理中断异常,因此线程会陷入无限循环中,试图从中断状态中恢复,这就会导致 CPU 使用率一直飙升。a0B28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-101702-0.html为什么StampedLock会导致CPU100%?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 火山引擎 RTC 实时媒体处理平台的技术实践

下一篇: 直接把任意网站变为 API 接口?Firecrawl有点牛了!

标签:
  • 热门焦点
  • 鸿蒙OS 4.0公测机型公布:甚至连nova6都支持

    华为全新的HarmonyOS 4.0操作系统将于今天下午正式登场,官方在发布会之前也已经正式给出了可升级的机型产品,这意味着这些机型会率先支持升级享用。这次的HarmonyOS 4.0支持
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    【Techweb评测】去年10月,iQOO推出了一款Neo7手机,该机搭载了联发科天玑9000+,配备独显芯片Pro+,带来了同价位段最佳的游戏体验,一经上市便受到了诸多用
  • 质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
Top