ReentrantReadWriteLock
全部标签概述ReentrantReadWriteLock不知道大家熟悉吗?其实在实际的项目中用的比较少,反正我所在的项目没有用到过。ReentrantReadWriteLock称为读写锁,它提供一个读锁,支持多个线程共享同一把锁。它也提供了一把写锁,是独占锁,和其他读锁或者写锁互斥,表明只有一个线程能持有锁资源。通过两把锁的协同工作,能够最大化的提高读写的性能,特别是读多写少的场景,而往往大部分的场景都是读多写少的。本文主要讲解ReentrantReadWriteLock的使用和应用场景。ReentrantReadWriteLock介绍ReentrantReadWriteLock实现了ReadWrit
下面是典型的读写模式(读多写少)privateReadWriteLocklock=newReentrantReadWriteLock();privateintvalue;publicvoidwriteValue(intnewValue){lock.writeLock().lock();try{this.value=newValue;}finally{lock.writeLock().unlock();}}publicintreadValue(){lock.readLock().lock();try{returnvalue;}finally{lock.writeLock().unlock
来自ReentrantReadWriteLockclassjavadoc:voidprocessCachedData(){rwl.readLock().lock();if(!cacheValid){//Mustreleasereadlockbeforeacquiringwritelock5:rwl.readLock().unlock();6:rwl.writeLock().lock();//Recheckstatebecauseanotherthreadmighthaveacquired//writelockandchangedstatebeforewedid.if(!cacheVal
正如这个问题的几个答案所建议的那样:Whatisthenameofthislockingtechnique?我实现了一个ReentrantReadWriteLock并看到了很大的加速(我知道我的类(class)中存在一些锁争用,使用可重入锁确实有助于加快速度)。但现在我想知道:如果在一个类中所有访问(读取和写入)都是通过首先锁定读锁或写锁来完成的,这是否意味着synchronized关键字不应再在该类中使用?例如,这是在http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantReadWri
我正在尝试实现一个读/写缓冲区类,在该类中它可以支持多个写程序和读程序,并且在写程序编写缓冲区的同时,读程序可以同时读取缓冲区。这是我的代码,到目前为止我还没有看到任何问题,但是我不确定100%是否是线程安全的或者是否有更好的方法。publicclassBuffer{privateStringBuildersb=newStringBuilder();privatefinalReentrantReadWriteLocklock=newReentrantReadWriteLock();privateRandomrandom=newRandom();publicvoidread(){try{
什么是ReentrantReadWriteLock的升级/降级?我看到javadoc关于升级/降级:“锁降级:重入还允许从写锁降级为读锁,方法是获取写锁,然后获取读锁,然后释放写锁。但是,从读锁升级到写锁是不可能的。”并提供了一个示例:classCachedData{Objectdata;volatilebooleancacheValid;ReentrantReadWriteLockrwl=newReentrantReadWriteLock();voidprocessCachedData(){rwl.readLock().lock();if(!cacheValid){//upgrade
ReentrantReadWriteLock有公平和非公平(默认)模式,但是文档太难理解了。我怎么理解呢?如果有一些代码示例来演示它,那就太好了。更新如果我有一个写线程和很多读线程,哪种模式更好用?如果我使用非公平模式,写线程是否有可能获得锁的机会很小? 最佳答案 非公平是指当锁准备被新线程获取时,该锁不保证谁获取锁的公平性(假设有多个线程请求锁当时)。换句话说,可以想象一个线程可能会一直处于饥饿状态,因为其他线程总是设法任意获取锁而不是它。公平模式更像是先到先得,其中保证线程在某种程度上公平,它们将以公平的方式获得锁(例如,在开始
我发现ReentrantReadWriteLock的写锁提供了一个isHeldByCurrentThread()方法来检查调用线程是否持有那个锁。但是读锁没有对应的isHeldByCurrentThread()方法。为什么不呢? 最佳答案 我认为答案在DougLeas对这个问题的评论中:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6207928.DougLea写道:Thecurrentdesignandbehaviorareintentional.Read-locksaren
Java大师,目前我们有一个HashMap经常读取并偶尔修改,我们遇到了在修改/重新加载期间,读取操作返回null的问题这是NotAcceptable。要解决这个问题,我有以下选项:A.使用ConcurrentHashMap这看起来像是首选,但我们正在谈论的操作是reload()-表示clear()其次是replaceAll().所以如果Map正在阅读帖子clear()和前replaceAll()它返回null这是不可取的。即使我synchronize这并不能解决问题。B.基于ReentrantReadWriteLock创建另一个实现我将在哪里创建acquireWriteLock之前r
我对多线程环境有些陌生,我正在尝试针对以下情况提出最佳解决方案:我每天早上从数据库中读取一次数据,并将数据存储在单例对象中的HashMap中。我有一个setter方法,该方法仅在发生日内数据库更改时调用(每天发生0-2次)。我还有一个getter,它返回map中的一个元素,这个方法每天被调用数百次。我担心在清空和重新创建HashMap时调用getter的情况,因此试图在空/格式错误的列表中查找元素。如果我让这些方法同步,它会阻止两个读者同时访问getter,这可能是一个性能瓶颈。我不想对性能造成太大影响,因为写操作很少发生。如果我使用ReentrantReadWriteLock,这是否