问题标签 [reentrantreadwritelock]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 当多个线程想要访问 ReentrantReadWriteLock 时会发生什么?
当应用 reentrantReadWriteLock 并且它被锁定时,如果另一个线程在执行另一个块时访问该锁会发生什么?(因此,在它到达 .unlock 之前)
方法被取消了吗?或者它已经停滞不前了?:O
java - 为什么 ReentrantReadWriteLock 不公平时写线程无法获得锁?
从这个问题如何理解 ReentrantReadWriteLock 的“非公平”模式?,我认为所有线程都有相同的机会获得锁,无论哪个先来。
所以我写了这段代码来测试它:
一开始,有一个线程拿到了写锁,并保持了3s。在此期间,一个线程想要获得读锁,然后有 1000 个线程想要获得写锁。
由于 ReentrantReadWriteLock 默认使用非公平模式,我认为写线程有很大的机会获得写锁。但是我运行了很多次,每次读取线程都赢了!
输出是:
我是否理解“不公平”错误?
更新 根据 paxdiablo 的回答,我将代码修改为:
现在有一个线程想要写锁,1000 个读线程想要读锁。但输出是:
似乎它仍然是“先到先得”。
java - 我可以将 java.util.concurrent.locks.Lock 更改为 java.util.concurrent.locks.ReentrantReadWriteLock;
我有一个创建锁的方法。
然后我将此对象传递给使用锁定接口的方法。
在该方法中,我只执行以下操作。
java - 我如何将 ReentrantReadWriteLock.readLock 或 ReentrantReadWriteLock.writeLock 转换为我的类对象
我想要做的是让当前线程一次保持读取计数的数量。我为此编写了一个包装器,但我的问题是 ReadLock() 方法正在返回 ReentrantReadWriteLock.WriteLock 所以我没有多余的getThreadReadLockCount 之后。我想要的是 readLock() 方法应该返回我,这样我就可以有多余的 count 方法。有任何想法吗。?
java - 我如何在 ReentrantReadWriteLock ReadLock 和 WriteLock 上创建包装器
我有一个ReentrantReadWriteLock
. 包含ReadLockReentrantReadWriteLock
和 WriteLock 作为子类。
然后我必须能够做类似下面的事情
或者
是否有可能实现这一目标。
java - Readlock 和 Writelock 会导致 writer 饿死吗?
在解决读写问题时,我尝试使用ReentrantReadWriteLock
. 我知道所有读者都可以同时获得读锁,但是写锁必须等待所有读锁被释放。如果我们有很多读者,这会导致作者处于饥饿状态吗?
java - ReentrantReadWriteLock 委托给父线程
我想从持有写锁的线程向 ForkJoinPool 或 ParallelArray 提交任务。通过检查当前线程是否持有相关锁来保护对我们域模型的访问。为了允许 FJ 工作人员在其上执行任务(只读,例如查询),他们需要将访问检查委托给产生它们的线程。
我使用对生成线程的引用对 ForkJoinWorkerThread 进行了子类化。然后,我将 ReentrantReadWriteLock 子类化并覆盖 isWriteLockedByCurrentThread 以执行通常的检查,并回退到检查,如果线程是委托 FJWorker 的实例,则委托线程(父线程)是锁的所有者,使用ReentrantReadWriteLock#getOwner () :
但是,getOwner() 的文档说明了以下内容:
当不是所有者的线程调用此方法时,返回值反映了当前锁定状态的最大努力近似值。例如,即使有线程试图获取锁但尚未这样做,所有者也可能暂时为空。
我想理解这意味着如果我在已被授予访问权限的线程中提交任务,此方法将正确返回对它的引用。不幸的是,这甚至没有暗示。
如果我不能使用这种方法,这种委托还有哪些其他选择?
谢谢你。
java - 如何查明 ReentrantReadWriteLock 的 ReadLock 是否在 API 级别 9 之前持有
我注意到,JavaReentrantReadWriteLock
在 API 版本 <9 和 >=9 中有所不同。对我来说尤其重要的是,该方法getReadHoldCount()
在旧版本中不可用。
现在我的问题是,如果没有此方法,如何检测当前线程是否持有 ReadLock?我只看到手动计数器或包装类的可能性,有没有内置的方法来实现这一点?
java - ReentrantReadWriteLock 挂起
知道为什么这个构造函数无限期挂起吗?我正在尝试创建一个线程安全的单例。
顺便说一句,我意识到将锁放在静态吸气剂中可能会更好;我只是想知道在构造函数中使用锁是否本质上是错误的
java - Java:具有优先级的 ReentrantReadWriteLock
以下是典型的读写器模式(读多写少)
我想知道是否可以优先考虑作者和读者?例如,如果其他线程不断持有读锁,通常 writer 可能会等待很长时间(可能永远),所以是否可以让 writer 具有更高的优先级,所以每当 writer 到来时,它可以被认为是高优先级(跳线)之类的。