问题标签 [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.

0 投票
4 回答
718 浏览

java - 当多个线程想要访问 ReentrantReadWriteLock 时会发生什么?

当应用 reentrantReadWriteLock 并且它被锁定时,如果另一个线程在执行另一个块时访问该锁会发生什么?(因此,在它到达 .unlock 之前)

方法被取消了吗?或者它已经停滞不前了?:O

0 投票
1 回答
904 浏览

java - 为什么 ReentrantReadWriteLock 不公平时写线程无法获得锁?

从这个问题如何理解 ReentrantReadWriteLock 的“非公平”模式?,我认为所有线程都有相同的机会获得锁,无论哪个先来。

所以我写了这段代码来测试它:

一开始,有一个线程拿到了写锁,并保持了3s。在此期间,一个线程想要获得读锁,然后有 1000 个线程想要获得写锁。

由于 ReentrantReadWriteLock 默认使用非公平模式,我认为写线程有很大的机会获得写锁。但是我运行了很多次,每次读取线程都赢了!

输出是:

我是否理解“不公平”错误?


更新 根据 paxdiablo 的回答,我将代码修改为:

现在有一个线程想要写锁,1000 个读线程想要读锁。但输出是:

似乎它仍然是“先到先得”。

0 投票
1 回答
128 浏览

java - 我可以将 java.util.concurrent.locks.Lock 更改为 java.util.concurrent.locks.ReentrantReadWriteLock;

我有一个创建锁的方法。

然后我将此对象传递给使用锁定接口的方法。

在该方法中,我只执行以下操作。

0 投票
1 回答
333 浏览

java - 我如何将 ReentrantReadWriteLock.readLock 或 ReentrantReadWriteLock.writeLock 转换为我的类对象

我想要做的是让当前线程一次保持读取计数的数量。我为此编写了一个包装器,但我的问题是 ReadLock() 方法正在返回 ReentrantReadWriteLock.WriteLock 所以我没有多余的getThreadReadLockCount 之后。我想要的是 readLock() 方法应该返回我,这样我就可以有多余的 count 方法。有任何想法吗。?

0 投票
2 回答
204 浏览

java - 我如何在 ReentrantReadWriteLock ReadLock 和 WriteLock 上创建包装器

我有一个ReentrantReadWriteLock. 包含ReadLockReentrantReadWriteLock和 WriteLock 作为子类。

然后我必须能够做类似下面的事情

或者

是否有可能实现这一目标。

0 投票
1 回答
955 浏览

java - Readlock 和 Writelock 会导致 writer 饿死吗?

在解决读写问题时,我尝试使用ReentrantReadWriteLock. 我知道所有读者都可以同时获得读锁,但是写锁必须等待所有读锁被释放。如果我们有很多读者,这会导致作者处于饥饿状态吗?

0 投票
1 回答
211 浏览

java - ReentrantReadWriteLock 委托给父线程

我想从持有写锁的线程向 ForkJoinPool 或 ParallelArray 提交任务。通过检查当前线程是否持有相关锁来保护对我们域模型的访问。为了允许 FJ 工作人员在其上执行任务(只读,例如查询),他们需要将访问检查委托给产生它们的线程。

我使用对生成线程的引用对 ForkJoinWorkerThread 进行了子类化。然后,我将 ReentrantReadWriteLock 子类化并覆盖 isWriteLockedByCurrentThread 以执行通常的检查,并回退到检查,如果线程是委托 FJWorker 的实例,则委托线程(父线程)是锁的所有者,使用ReentrantReadWriteLock#getOwner () :

但是,getOwner() 的文档说明了以下内容:

当不是所有者的线程调用此方法时,返回值反映了当前锁定状态的最大努力近似值。例如,即使有线程试图获取锁但尚未这样做,所有者也可能暂时为空。

我想理解这意味着如果我在已被授予访问权限的线程中提交任务,此方法将正确返回对它的引用。不幸的是,这甚至没有暗示。

如果我不能使用这种方法,这种委托还有哪些其他选择?

谢谢你。

0 投票
0 回答
219 浏览

java - 如何查明 ReentrantReadWriteLock 的 ReadLock 是否在 API 级别 9 之前持有

我注意到,JavaReentrantReadWriteLock在 API 版本 <9 和 >=9 中有所不同。对我来说尤其重要的是,该方法getReadHoldCount()在旧版本中不可用。

现在我的问题是,如果没有此方法,如何检测当前线程是否持有 ReadLock?我只看到手动计数器或包装类的可能性,有没有内置的方法来实现这一点?

0 投票
2 回答
929 浏览

java - ReentrantReadWriteLock 挂起

知道为什么这个构造函数无限期挂起吗?我正在尝试创建一个线程安全的单例。

顺便说一句,我意识到将锁放在静态吸气剂中可能会更好;我只是想知道在构造函数中使用锁是否本质上是错误的

0 投票
2 回答
4600 浏览

java - Java:具有优先级的 ReentrantReadWriteLock

以下是典型的读写器模式(读多写少)

我想知道是否可以优先考虑作者和读者?例如,如果其他线程不断持有读锁,通常 writer 可能会等待很长时间(可能永远),所以是否可以让 writer 具有更高的优先级,所以每当 writer 到来时,它可以被认为是高优先级(跳线)之类的。