问题标签 [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 - Quasar ReenterantReadWriteLock 无法获取
我有一把锁:
我在一个里面执行这个块Fiber
:
那是因为在文档中它说:
public void lock()
如果读锁和写锁都没有被另一个链持有,则获取写锁并立即返回,将写锁持有计数设置为 1。
如果当前链已经持有写锁,那么持有计数加一并且方法立即返回。
如果锁被另一个 strand 持有,则当前 strand 出于 strand 调度目的而被禁用并处于休眠状态,直到获得写锁为止,此时写锁持有计数设置为 1。
所以我得到这个输出:
这意味着读锁和写锁都不被任何人持有Strand
。那为什么我的Fiber
被屏蔽了?
编辑。我很确定每一个获得这个锁的纤程都会释放它,所以其他纤程不可能无限地获得它。
java - 检查 `ReentrantReadWriteLock` 中是否拥有 readLock
ReentrantReadWriteLock
我有一些密切相关的问题在尝试使用来控制对具有许多不同读写操作的相当复杂的数据结构的访问时弹出。根据文档中的示例,我已经获取了一个读取和写入锁,并且我正在使用它们(据我所知)成功管理对该数据结构的并发访问。然而,在调试另一个问题时,我注意到有时我在同一个线程中获得了多个读锁。其基本原因是我有许多复杂的查询会调用更简单的查询(请参见下面的示例)。复杂的查询可以被认为是一个事务,即在和对ingetVersion()
的访问之间不应该有写操作。data
myQuery
. 这个当前的解决方案有效,但这意味着在代码中的某些地方,我将拥有同一个线程拥有的多个读锁。我注意到 write 等价物有一个isHeldByCurrentThread()
方法,但奇怪的是在readLock
. 我找不到以下内容:
- 在同一个线程中有多个读锁是不是很糟糕(糟糕的风格、性能或未来错误的风险)?
- is 不适合用于
WriteLock.isHeldByCurrentThread
检查错误(例如,期望写入锁但不存在,或者作为释放写入锁的条件)? - 如果这是一个问题,是否有最佳实践来决定如何进行?我是否将
lockedAquired
布尔值传递给可能从已经拥有锁的代码中调用的方法,我是否确保它们是唯一获取的,还是应该使用ReadLock.tryLock()
?
这是代码示例:
java - ReentrantReadWriteLock - 为什么阅读器不能获取作者的锁?
在ReentrantReadWriteLock
文档中说:
如果我理解正确,这意味着您可以从同一个线程执行:
这是有道理的:如果您已经锁定,则write
没有其他线程可以输入锁定的代码。但是如果你锁定了,如果没有其他线程锁定read
,为什么你不能进入同一个线程中的块?所以这不起作用:write
read
为什么必须先解锁read
才能锁定write
在同一个线程中?
java - 有条件的公平读写锁
首先,我检查了有关此主题的先前问题,但是没有一个适合我的具体问题。
我得到了以下代码,它说明了带有时间戳的传感器和存储在双数组中的数据,另外还有我实现的 FairRWLock 的一个实例。
它支持更新(取决于接收到新数据的时间)和获取(提取存储在特定传感器中的数据)。
这是我对 FairRWLock 的实现:
我对条件锁定不是很熟悉,而且我的代码似乎遭受饥饿甚至死锁的困扰。但是我找不到问题(很可能在 FairRWLock 实现中的某个地方)。
java - ReadWriteLock 写锁饱和
我遇到了 Writer 线程在没有锁的情况下被饿死的问题。请看下面的代码。如果我试图获取tryLock()
用于读取锁的锁,写入器进程将变得饥饿并且永远无法写入。即使公平,编写程序也会完全饿死并且永远不会执行。相反,如果我只尝试,reader.readLock()
那么编写器进程将能够获得锁。
如果我遗漏了什么,请告诉我,即使它设置为高优先级,编写器进程线程也永远不会获得锁并且会卡住等待锁。
谁能告诉我是否可以使用trylock()
with ReadWriteLocks
。
java - 如何使用java同步文件操作?同步还是锁定?
我使用 JSCH 库创建了一个用于读取和写入远程位置属性文件的应用程序。
我想同步写操作。
这是我的代码,
这就是我要的
如果用户尝试写入 Web 应用程序上的属性文件说“A”,则尝试写入同一个 Web 应用程序的同一文件的所有其他用户应该等待,但另一个用户可以写入同一个 Web 应用程序或文件的另一个文件在另一个 webapp 上具有相同的名称。
同步方法可以完成所有这些工作吗?它如何识别 webapp 和属性文件?
我们需要同步读写操作吗?
如何在这种情况下实现锁定?
注意:我看到了关于并发的不同问题,但这些问题并没有消除我的疑虑,这就是为什么要问新问题,请帮助我对此进行澄清
java - 使用 ReentrantReadWriteLock 时是否需要降级锁定
ReentrantReadWriteLock 的文档中有一个关于锁降级的示例用法(请参阅此)。
如果我更改Object data
为volatile Object data
,我是否还需要将写锁降级为读锁?
更新
我的意思是,如果我添加volatile
到data
,在我finally
在评论中释放块中的写锁之前A
,我是否还需要获取读锁作为评论中的代码B
并C
做?或者代码可以利用volatile
?
java - 写时读锁
我需要帮助来理解以下代码:
如果我们在上面的代码中不使用 Read Locks 会发生什么?喜欢 :
- 当我们只写数据时,我们真的需要读锁吗?
- 上面两个代码有什么区别?
- 我们是否应该使用读取锁来访问对象(composedPredicate)进行空检查?
java - 我使用 ReentrantReadWriteLock 有什么问题?
我有麻烦ReentrantReadWriteLock
。当我尝试擦除文件时线程挂起。我有一个预定的读取操作和最终的写入操作(当用户按下按钮时),它们使用ReentrantReadWriteLock
. 下一个代码看起来不适合使用,抱歉,为简单起见,我将所有内容放在一个地方。
并像这样编写操作:
当wipeFile()
方法第一次触发时,一切正常。但是从第二次尝试开始,它就挂了lock.writeLock().lock()
;我试图wipeFile()
从另一个线程调用方法,因为有人写道,写锁不应该在具有读锁的一个线程中使用。
但这无济于事,另一个线程也挂起。
那么,问题是我对 ReentrantReadWriteLock 的使用有什么问题?
java - ReentrantReadWriteLock 阻止我对对象采取行动?
我有以下对象:
我有以下块:
正如你所看到的,我锁定了这段代码的一部分,以便让线程在没有人尝试写东西的时候从这段代码中读取。
另外,我有以下代码:
现在,我知道当第一个代码块发生时,第二个代码块将等待第一个代码块完成,我的问题是,在下一个代码块中,我是否能够dataStructure
在有人写的同时从对象中读取或者尽管我没有提到任何 ReentrantReadWriteLock 锁,但还是从他那里读到:
先感谢您!