问题标签 [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 投票
1 回答
501 浏览

multithreading - 读锁和写锁线程等待读锁

我有一个多线程程序,我在其中创建了一个公允价值为 true 的 ReadWriteLock 实例。此应用程序已停止响应。

以下是我们基于线程转储的发现。一个线程获得了读锁,并在执行期间阻塞了 DB 操作。它很长时间没有释放锁。

除了上述线程之外,还有三个线程。一个线程正在等待获取写锁。而另外两个线程正在等待获取读锁。

问题是为什么两个线程都在等待读锁?是否因为公允价值为真并且请求写锁的线程早于请求读锁的两个线程而发生?如果请求写的线程来得更早,系统会阻塞请求读锁的线程吗?

0 投票
1 回答
623 浏览

java - 在可能已经解锁的锁上调用 unlock() 是否安全?

在这个例子中:

如果语句中的解锁已经执行mLock.writelock.unlock(),在块中调用时会发生什么?finallyif

此代码是否安全,或者我是否需要在尝试解锁之前检查是否有锁?

0 投票
1 回答
625 浏览

java - isWriteLocked 上的可重入读写锁同步

我目前正在考虑实现一个会话管理器 java 类,该类提供按需读取和刷新会话令牌的功能。如果正在刷新会话令牌(即从服务器获取),则会话令牌读取器应阻塞,直到刷新完成。同样,刷新请求会被阻止,直到任何正在进行的读取都未完成。由于会话令牌读取请求与会话令牌刷新请求相比非常频繁,因此我决定使用 ReentrantReadWriteLock 来实现读取和刷新之间的同步。这是它的外观:

我的第一次尝试是在写锁上使用 tryLock(),这样如果它已经被锁定以进行写入,tryLock() 将返回 false,然后获取读锁并阻塞,直到写锁被释放,从而重新安排读阻塞线程来完成读取。此逻辑适用于多个线程同时调用 refreshSession() 从而仅允许一个线程启动会话令牌刷新而所有其他线程失败并阻塞读锁的情况。

然而,如果一个线程刚刚获得了一个读锁(通过调用 readToken())并且另一个线程调用 refreshToken() 来获得一个写锁,那么上面的逻辑就会失败——在这种情况下 tryLock() 将失败,因为缺少刷新请求,因为结果。

作为替代方案,我正在查看 readWriteLock.isWriteLocked() 方法,该方法检查是否有任何线程获得了写锁:

但是,我对这种方法没有太多经验,也不完全确定它会产生的同步影响,因为我想确保只有一个线程可以获得写锁,并且后续请求会被读取。任何建议/指针将不胜感激。

0 投票
3 回答
357 浏览

java - 每个要同步的变量一个 ReentrantReadWriteLock 实例?

我打算将一些代码与一些全局变量并行化。我将使用 ReentrantReadWriteLock。我是否理解正确,我需要为每个变量创建一个自己的 ReentrantReadWriteLock 实例,以确保线程安全?

我的意思是,当我有两个列表时,每个线程都可以附加一个项目,并且所有线程有时都从该列表中读取项目。在那种情况下,我会实现类似的东西:

如果我有更多变量,例如数据库连接(池)、记录器、更多列表等,该怎么办?

我需要制作一个新的 ReentrantReadWriteLock 还是我遗漏了什么?互联网上的样本只处理一个变量。

提前致谢。

0 投票
1 回答
2224 浏览

java - 为什么不允许 ReadWriteLock 升级?

ReadWriteLock实现允许降级ReentrantReadWriteLocktryLock()从下面的示例中总是返回true):

不允许以类似方式升级锁的想法是什么?在没有其他线程持有读锁的情况下,下面的tryLock()锁方法可以安全地返回无死锁风险:true

0 投票
0 回答
309 浏览

java - 在 Eclipse 中调试 ReentrantReadWriteLock 死锁

我有一个偶尔会死锁的应用程序(比如每月一次)。

现在,我第一次在 Eclipse 调试器中运行时重现了这种情况。

似乎所有线程都在等待 WriteLock 被释放。

我需要一种方法来找出(200 个)线程中的哪个持有锁。

但是在 eclipse 中暂停线程并检查没有产生任何结果,因为 eclipse 告诉我它无法访问我想要查看的变量,因为线程被手动挂起。

我不想重新启动应用程序,因为我不知道我是否可以设法再次陷入这种僵局。

那么如何找到锁持有人呢?

编辑:我已经尝试过 jstack 让我成为线程转储。但是我只能找到等待锁但没有持有它的线程。

0 投票
1 回答
940 浏览

java - ReentrantReadWriteLock 是否实现为自旋锁?

如何ReentrantReadWriteLock工作?是自旋锁吗?

问题来自 Elasticsearch,当它显示

在所有快照中的热线程中,cpu 使用率同时很高。它看起来像自旋锁。

0 投票
0 回答
568 浏览

java - ReentrantReadWriteLock - 由于读锁,无法获取写锁

我在获取写锁时遇到问题,然后使用ReentrantReadWriteLock进行一些操作

有两个类说 ClassA 和 ClassB ClassA 持有写锁 ClassB 有读锁

用户可以在其中更新/创建一个 UI,当此事件发生时,我正在激活 ClassA 中的写锁,以便阻止 ClassB 的读者。

但出于某种奇怪的原因,ClassA 正在等待(无限地)获取写锁!

我们可以重置不同线程获取的所有锁,然后获取写锁吗?请建议是否有其他方法..

0 投票
1 回答
1423 浏览

java - Java:ReadWriteLock 和 ReentrantReadWriteLock 之间的区别

我有一些数据结构,我想在其中专门锁定写入访问,但启用并行读取访问。

我进行了一些搜索并找到了类ReadWriteLockReentrantReadWriteLock- 它们都提供了一个读锁和一个写锁。

我不明白它们之间有什么区别。有人可以解释一下吗?

0 投票
1 回答
85 浏览

java - Java ReadWriteLock 重入

嗨,我已经阅读了 Java 中的 ReadWriteLock,但我不确定我是否掌握了它的重入部分。这是两个简短的代码示例,仅使用一个主线程来显示重入

第二个例子

在第一个中执行了 sysout,但在第二个中没有执行,这是为什么呢?两个锁都将由同一个线程获得,所以我们在这里有一个可重入的情况,但是只有在首先获得 writelock 时才能实现入口,这很奇怪,因为在不可重入的情况下,文档说写操作对所有线程都是独占的其他操作(无论是写还是读)。