首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ReentrantReadWriteLock 类中的 readLock() 或 writeLock() 方法创建的休眠线程会消耗 CPU 周期吗?

首先,我们来了解一下ReentrantReadWriteLock类。ReentrantReadWriteLock是Java并发库中的一个读写锁实现,它允许多个线程同时读取共享资源,但在写入时只允许一个线程执行。这有助于提高并发性能,特别是在读多写少的场景中。

关于您的问题,readLock()和writeLock()方法创建的休眠线程会消耗CPU周期吗?

在Java中,当一个线程调用readLock()方法时,如果写锁被其他线程持有,那么该线程会被阻塞,进入休眠状态,直到读锁可用。在这种情况下,休眠线程不会消耗CPU周期,因为它处于休眠状态。

当一个线程调用writeLock()方法时,如果读锁或写锁被其他线程持有,那么该线程会被阻塞,进入休眠状态,直到写锁可用。在这种情况下,休眠线程也不会消耗CPU周期,因为它处于休眠状态。

总之,当使用ReentrantReadWriteLock类时,readLock()和writeLock()方法创建的休眠线程不会消耗CPU周期。这是因为休眠线程在等待锁时会被阻塞,不会执行任何操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java并发编程:同步锁、读写锁

1 即使休眠了 3 秒,线程 2 也还是等到线程 1 执行完才会继续执行。   ...lock.readLock 方法用于获取一个读锁,而 lock.writeLock 方法用于获取一个写锁。读锁允许多个线程进行读取数据操作,但不允许修改操作。而写锁则不允许其他线程进行读和写操作。...三、一个读写锁例子 读写锁与一般不同之处就是它有两种锁,分别是读锁(ReadLock)和写锁(WriteLock)。当我们锁上读锁时候,其他线程也可以读取对象数据,但是不能修改。...().unlock(); } } 在上面这个例子,我们创建了3个读数据进程以及3个写数据进程,不断取出、写入MyQueue数据。...这就说明写锁不允许多个线程同时写,也不允许读。 这就是读写锁一个非常重要应用,比起synchronizedlock锁,它允许多个线程同时读,但是同时有保证了写数据时候不会有多个线程同时操作。

1.1K70

JDK源码分析-ReentrantReadWriteLock

而很多时候会出现“读多写少”情况,若用 ReentrantLock 降低并发量,此时就比较适合 ReentrantReadWriteLock 出场了。...方法实现,该方法通过判断等待队列第一个线程是否为写线程,若是则返回 true,表示给写线程让道。...两个方法都通过调用父 AQS hasQueuedPredecessors 方法判别,二者都是根据等待队列是否有其他线程,若有其他线程,则当前线程等待。...若锁被其他线程持有,当前线程被禁用并处于休眠状态, * 直到当前线程获取写锁(计数设为1)被其他线程中断。...而写锁是互斥WriteLock 大部分方法都是通过 AQS 独占模式方法实现ReentrantReadWriteLock 主要代码就分析到这里,下面简单分析其用法和使用场景。

37610
  • 由浅入深讲解JUC下 CAS + Lock

    如果出现大量竞争消耗CPU,同时带来死锁其他安全隐患。...Unsafe,全限定名是sun.misc.Unsafe,UnSafe中所有的方法都是native修饰,也就是说UnSafe方法都是直接调用操作底层资源执行响应任务。主要功能如下: ?...// jdk1.8AtomicLong实现代码,这段代码在sun.misc.Unsafe // 当线程竞争很激烈时,while判断条件CAS连续多次返回false,这样就会造成无用循环,循环中读取...PS 可重入含义: 同一线程外层函数获得锁后,内层递归函数仍能获取该锁代码。在同一个线程在外层方法获取锁时候,在进入内层方法会自动获取锁。...public interface ReadWriteLock { Lock readLock(); Lock writeLock(); } 具体实现ReentrantReadWriteLock

    45110

    JUC系列(八)| 读写锁-ReadWriteLock

    一个非常喜欢女孩子拍照片 作者:次辣条 一、读写锁 1)概述: 我们开发应该能够遇到这样一种情况,对共享资源有读和写操作,且写操作没有读操作那么频繁。...针对这种场景,Java并发包下提供了读写锁 ReadWriteLock(接口) | ReentrantReadWriteLock(实现)。...非公平锁主张竞争获取,可能延缓一个多个读线程,但是会比公平锁有更高吞吐量。 公平模式 当以公平模式初始化时,线程将会以队列顺序获取锁。...支持中断锁获取 在读锁和写锁获取过程中支持中断 监控 提供一些辅助方法,例如hasQueuedThreads方法查询是否有线程正在等待获取读锁写锁、isWriteLocked方法查询写锁是否被任何线程持有等等...; //资源 class ReentrantReadWriteLockDemo{ //创建 map 集合 private volatile Map

    33920

    深入探索Java并发库(JUC)ReentrantReadWriteLock

    这使得线程可以在持有锁情况下进行递归调用多次访问共享资源,而不会产生死锁。 公平性选择:ReentrantReadWriteLock可以在创建时选择是否是公平。...公平锁按照线程请求锁顺序来分配锁,而非公平锁则可能跳过等待队列某些线程直接获取锁。...省略其他方法和字段 ... } ReentrantReadWriteLock定义了两个内部类ReadLockWriteLock来实现读锁和写锁功能。...读线程只会读取计数器值,而写线程修改计数器值。...我们还定义了两个内部类ReaderThread和WriterThread来分别代表读线程和写线程。在main方法,我们创建了多个读线程和写线程并启动它们,以模拟并发访问共享资源场景。

    15210

    花几分钟看一下 ReentrantReadWriteLock 原理!

    final ReentrantReadWriteLock.ReadLock readerLock; /** 提供写锁内部类 */ private final ReentrantReadWriteLock.WriteLock...在 ReentrantReadWriteLock 同样存在一个 Sync 继承了 AbstractQueuedSynchronizer,也是 FairSync、NonfairSync 。...Q:当前线程获取锁失败,被阻塞后续操作是什么? A:获取失败,放到 AQS 等待队列,在队列不断循环,监视前一个节点是否为 head ,是的话,重新尝试获取锁。 Q:锁降级是怎么降级?...从而导致线程 A 在一次执行过程数据不一致。 小结 ReentrantReadWriteLock 读写锁,内部实现是 ReadLock 读锁 和 WriteLock 写锁。...ReadLockWriteLock 都是通过 AQS 来实现。获取锁失败后会放到 AQS 等待队列,后续不断尝试获取锁。

    36110

    《Java-SE-第二十七章》之常见锁策略

    Java 标准库提供了 ReentrantReadWriteLock , 实现了读锁写锁,ReentrantReadWriteLock.ReadLock 表示一个读锁....,这个对象提供了 lock / unlock 方法进行加锁解锁。 ReentrantReadWriteLock.WriteLock 表示一个写锁....读取操作使用读锁(readLock)进行保护,允许多个线程同时读取共享数据。写入操作使用写锁(writeLock)进行保护,确保在写入过程只有一个线程能够修改共享数据。  ...在main方法,我们创建了多个读取线程和一个写入线程。读取线程不断读取共享数据并输出,而写入线程每隔一段时间写入一个新数据。...缺点: 如果锁被其他线程持有的时间比较久, 那么就会持续消耗 CPU 资源. (而挂起等待时候是不消耗 CPU ). 挂起等待锁 当获取锁失败后,就会挂起等待。

    16920

    ReentrantReadWriteLock读写锁

    概述 ReentrantReadWriteLock是Lock另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock...在实际应用,大部分情况下对共享数据(如缓存)访问都是读操作远多于写操作,这时ReentrantReadWriteLock能够提供比排他锁更好并发性和吞吐量。...所有 ReadWriteLock实现都必须保证 writeLock操作内存同步效果也要保持与相关 readLock联系。也就是说,成功获取读锁线程会看到写入锁之前版本所做所有更新。...仅写入锁提供了一个 Conditon 实现;读取锁不支持 Conditon ,readLock().newCondition() 抛出 UnsupportedOperationException。...,可以多个线程读数据 */ private Object data = null; /* 创建一个读写锁 */ ReadWriteLock rwlock = new ReentrantReadWriteLock

    49420

    字节面试:说说Java锁机制?

    2.锁实现在 Java 也有一些具体锁实现,用于代码层面的锁操作以此来保证线程安全,这些常见锁实现有以下几个:synchronized:内置锁(Monitor Lock),可以用于方法代码块,...当一个线程进入 synchronized 方法块时,它会自动获取对象锁,其他线程则需等待锁释放后才能进入。...();// 创建读锁ReentrantReadWriteLock.ReadLock readLock = lock.readLock();// 获取读锁readLock.lock(); try {...// 读取共享资源操作} finally { // 释放读锁 readLock.unlock(); }// 创建写锁ReentrantReadWriteLock.WriteLock writeLock...其中 readLock() 和 writeLock() 方法ReentrantReadWriteLock 用法类似,而 tryOptimisticRead() 方法则是 StampedLock 引入方法

    10210

    面试官:说说读写锁实现原理?

    1.读写锁介绍ReentrantReadWriteLock(读写锁)是 Java 并发包(java.util.concurrent.locks)一个,它实现了一个可重入读写锁。...ReentrantReadWriteLock.WriteLock 表示写锁:它提供了 lock 方法进行加锁、unlock 方法进行解锁。...4.AQSAbstractQueuedSynchronizer(AQS)是 Java 并发包一个抽象,位于 java.util.concurrent.locks 包。...如果获取失败,则将当前线程封装成节点加入等待队列,并阻塞当前线程。当持有锁线程释放锁时,唤醒等待队列后继节点线程,使其重新尝试获取锁。等待与唤醒等待队列节点通过自旋和阻塞来等待被唤醒。...唤醒操作按照一定规则选择等待队列节点进行唤醒。课后思考AQS 是如何实现独占锁和共享锁?AQS 使用了什么设计模式?

    13810

    线程安全使用 HashMap 四种技巧。

    构造函数调用初始化方法,初始化方法内部逻辑是:将配置数据存储到 HashMap 。...SimpleConfig 对外暴露了 getConfig 方法 ,当 main 线程初始化 SimpleConfig 对象之后,当其他线程调用 getConfig 方法时,因为只有读,没有写操作,所以是线程安全...:创建 ReentrantReadWriteLock 对象 , 当使用 ReadWriteLock 时候,并不是直接使用,而是获得其内部读锁和写锁,然后分别调用 lock / unlock 方法 ;...每个线程方法体内部创建HashMap 实例,在多线程环境下,不需要对 HashMap 进行任何同步操作。...2、 配置数据:初始化写,后续只提供读中间件在启动时,读取配置文件,将配置数据写入到 HashMap ,主线程写完之后,以后不会再有写入操作,其他线程可以读取,不会产生线程安全问题。

    13500

    读写锁原理

    使用ReentrantReadWriteLock读写锁方式,会调用readLock()和writeLock()两个方法,看下他们源码: public ReentrantReadWriteLock.WriteLock...再往下内容估计看过前面几篇文章都很熟悉了,独占锁通过state变量0和1两个状态来控制是否有线程占有锁,共享锁通过state变量0或者非0来控制多个线程访问。...在上面的代码ReadLockWriteLock使用了同一个AQS,那么在ReentrantReadWriteLock又是怎么控制读锁和写锁关系呢?...ReentrantReadWriteLock会发生写饥饿情况?如果发生,有没有比较好解决办法?...那么JDK就没有提供什么好办法来解决这个问题? 当然是有的,那就是JDK8新增改进读写锁---StampedLock.

    46400

    为什么StampedLock导致CPU100%?

    2.基本使用StampedLock 有三种读写方法readLock:读锁,用于多线程并发读取共享资源。writeLock:写锁,用于独占写入共享资源。...其中 readLock() 和 writeLock() 方法ReentrantReadWriteLock 用法类似,而 tryOptimisticRead() 方法则是 StampedLock 引入方法...interrupt(),但并未正确处理中断异常,因此线程陷入无限循环中,试图从中断状态恢复,这就会导致 CPU 使用率一直飙升。...CPU 使用率飙升问题:如果 StampedLock 使用不当,具体来说,在 StampedLock 执行 writeLock readLock 阻塞时,如果调用了中断操作,如 interrupt(...这是因为线程接收到了中断请求,但 StampedLock 并没有正确处理中断信号,那么线程可能陷入无限循环中,试图从中断状态恢复,这可能导致 CPU 使用率飙升。

    8310

    面试突击41:为什么要用读写锁?它有什么优点?

    1.读写锁使用 在 Java 语言中,读写锁是使用 ReentrantReadWriteLock 来实现,其中: ReentrantReadWriteLock.ReadLock 表示读锁,它提供了...ReentrantReadWriteLock.WriteLock 表示写锁,它提供了 lock 方法进行加锁、unlock 方法进行解锁。...ReentrantReadWriteLock(); // 创建读锁 final ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock...readLock = readWriteLock.readLock(); // 创建写锁 final ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock...(); } }); t2.start(); 以上程序执行结果如下: 1.3 写写互斥 多个线程同时使用写锁也是互斥,这称之为写写互斥,如下代码所示: // 创建读写锁 final ReentrantReadWriteLock

    42610

    线程基础(十八):ReentrantReadWriteLock源码分析

    1.结构及注释 1.1 结构 ReentrantReadWriteLock是基于AQS实现可重入读写锁。这个锁在使用时候将锁分为了两个部分,ReadLockWriteLock。...此外,写可以获得读锁,反之则不能,在其他引用程序,当在调用或者对在读锁下执行读方法过程中保持写锁时,重入操作很有用。如果读试图获取写锁,纳秒它将永远不成功。...用于读锁实现 writerLock private final ReentrantReadWriteLock.WriteLock 用于写锁实现 sync final Sync AQS继承,...4.实现ReadLockWriteLock ReentrantReadWriteLock封装了两个ReadLockWriteLock来对应读和写锁操作。...4.1 ReadLock ReadLock,内部引用了Sync,实际上就是将Sync共享模式相关方法包装为Lock。

    51140

    AQS源码分析之ReentrantReadWriteLock

    } 实例化时候根据fair值不同来创建不同sync,代表着同步公平性与非公平性。...writerShouldBlock方法和readerShouldBlock方法调用都是hasQueuedPredecessors方法,该方法实现在SyncAbstractQueuedSynchronizer...} 加锁 java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock#lock方法 // 获取写锁 // 如果没有读锁或者写锁被其他线程占有时获取写锁立即返回...(1); } 在写锁没有被其他线程占有时获取读锁立即返回; 如果写锁被其他线程占有那么当前线程会出于线程调度目的而被禁用,并且在获取读锁之前一直处于休眠状态。...它会首先创建线程对应AQS队列节点,然后将该节点添加到AQS队列。AQS队列是管理获取锁等待线程队列。

    58120

    笔记08 - Java线程同步Synchronized和ReentrantLock

    上面的代码,在不同线程调用不同对象printLog方法,两者相互不排斥,两个线程随机竞争CPU资源: ? 上面的打印效果可以看出,两个线程执行互不影响,打印信息是随机。...修饰静态方法 如果synchronized修饰静态方法,那么锁对象就是当前Class。在不同线程调用不同实例对象,也会有互斥效果。 下面将printLog修改为静态方法: ?...,另外两个线程由于已经通过while判断,所以不会再次进行whilesharedNumber判断,因此形成这种情况。...通过rwLock对象分别获得读锁(ReadLock)和写锁(WriteLock): ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock(...); ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock(); 3.

    38110

    ReadWriteLock场景应用解析

    读写锁接口:ReadWriteLock,它具体实现为:ReentrantReadWriteLock 在多线程环境下,对同一份数据进行读写,涉及到线程安全问题。...这时候可以在读写方法中加入互斥锁,任何时候只能允许一个线程一个读写操作,而不允许其他线程写操作,这样是可以解决这样以上问题,但是效率却大打折扣了。...其中它实现ReentrantReadWriteLock--顾名思义是可重入读写锁,允许多个读线程获得ReadLock,但只允许一个写线程获得WriteLock 读写锁机制: "读-读" 不互斥...如下代码产生死锁,因为同一个线程,在没有释放读锁情况下,就去申请写锁,这属于锁升级,ReentrantReadWriteLock是不支持。...【加锁顺序序号:6 】 如果不使用锁降级功能,如先释放写锁,然后获得读锁,在这个get过程,可能会有其他线程竞争到写锁 或者是更新数据 则获得数据是其他线程更新数据,可能造成数据污染,即产生脏读问题

    1.4K10
    领券