问题标签 [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.
scala - scala 集合循环缓冲区
只是在这里搞乱,使用循环缓冲区。这是一个明智的实现,还是有更快/更可靠的方法给这只猫剥皮?
java - 在同一个 try 块中锁定多个 ReentrantReadWriteLock 是否安全?
假设我有两个关键资源,foo 和 bar。我用一些ReentrantReadWriteLock
s保护他们
大多数操作只使用 foo OR bar,但其中一些恰好同时使用两者。现在,当使用单个锁时,您不能只这样做:
如果抛出异常,您的 foo 将永远锁定。相反,您将其包装起来,例如
但是,如果我需要同时处理这两个问题怎么办?把它们放在一个街区里安全吗?
选项1
或者是否有必要给每个锁自己的块:
选项 2
我不可能是第一个很难调查此问题的人......我知道选项 2 有“防弹”,但它也需要大量的维护。选项1可以接受吗?
java - 线程不使用 Condition 等待新数据
我正在尝试为实验室编写一些程序,该实验室基本上是一个将数据存储在文件夹中的网络缓存,因此如果客户端想要打开网页,如果该页面不存在,该页面将存储在缓存文件夹中,并且它将显示给客户。我能够下载和显示页面,但是当线程必须等待时出现问题,因为请求的资源正在被下载并存储在缓存文件夹中。
下载类如下:
DownloadsNode 类如下:
缓存类如下:
以前的所有类都从以下类中使用:
有几点需要考虑:
-我必须在每个节点中创建条件变量,以便线程将因此等待并实现打开/关闭锁并保证互斥的方法。
- 如果一个线程正在下载其他线程感兴趣的资源,我使用条件变量等待,并在资源下载并存储在缓存中时说“停止等待”。我在那部分做错了什么?(所有这些都在 MainThread 类中)
-当保证互斥时,我是否必须将同步放在正确的方法中,执行以下方式: -Lock -synchronized(this) 并做我必须做的任何事情 -Unlock 还是我在两种方式都做同样的事情?在管理下载列表和缓存时,我必须建立批评区域,所以我认为有些部分在不需要的方法名称中添加同步,或者我错误地使用了读写锁。
注意:由于我翻译了变量和方法的名称以帮助理解,我可能写了一些不同的东西,但在我的程序中是正确的
非常感谢先进
java - ReentrantReadWriteLock 是否在 writeLock 锁定时读取?
我研究ReentrantReadWriteLock
。
我为测试编写了简单的代码(我知道使用 Thread.sleep() 不能保证可预测的结果,但我认为我很幸运:)):
输出:
10401 - 401 == 10000
10000 现在是写作时间。
据我了解,第二个读取线程在写入之前无法完成。因此写入和第二次读取并行执行。这对我来说不是可预测的行为。
你怎么看待这件事?
java - 可重入读写锁。读写获取优先级
我研究 ReentrantReadWriteLock
来自 java 文档的片段:
直到当前等待的最早的写线程获得并释放写锁之后,该线程才会获得读锁
据我了解。
读取持续时间- 1 个时间单位
写入持续时间- 3 个时间单位
- 时间 0 - 获得写锁
- 时间 1 - 读锁尝试读
- 时间 2 - 写锁尝试写
因此,我期望以下顺序:
- 先写
- 第二次写
- 读
我的实验代码:
出去:
因此我得到
- 先写
- 读
- 第二次写
为什么我会得到这个结果?
是否可以打破 FIFO 排序?
更新
请比较 java doc 中的两个兄弟片段(关于公平模式):
第一的
如果持有写锁或存在等待写入线程,则尝试获取公平读锁(不可重入)的线程将阻塞。直到当前等待的最早的写线程获得并释放写锁之后,该线程才会获得读锁。当然,如果一个等待的写入者放弃它的等待,留下一个或多个读取线程作为队列中最长的等待者,并且没有写入锁,那么这些读取器将被分配读取锁。
第二:
除非读锁和写锁都空闲(这意味着没有等待线程),否则试图获取公平写锁(不可重入)的线程将阻塞。(请注意,非阻塞 ReentrantReadWriteLock.ReadLock.tryLock() 和 ReentrantReadWriteLock.WriteLock.tryLock() 方法不遵守此公平设置,如果可能,将获取锁,而不管等待线程。)
我不完全理解那里写的意思但是我看到ReentrantReadWriteLock
使用不同的策略来获取读锁和写锁。我建议如果 java doc 中的政治相同,就不会写两个缩进。
ReadLock 可以共享锁。难道只有一个区别吗?
java - 在另一个 ReentrantReadWriteLock 中使用 ReentrantReadWriteLock
我不确定我是否正确实现了 ReentrantReadWriteLock,所以如果你能告诉我我是否做错了什么,我将不胜感激。
场景:想象一下制作一件衬衫需要两个步骤。衬衫都是一样的。
- 第一步,缝纫工具缝制衬衫
- 在第二步中,扣扣工具从第一步中取出衬衫并将扣子放在上面。为简单起见,每件衬衫上只会放置一个纽扣。
步骤 1 和步骤 2 分别使用总共 10 个缝纫工具和 10 个纽扣工具。这些按钮被保存在橱柜的不同架子上。
我的目标是确保尽可能多的并发性,同时确保线程不会:
- 从同一个架子上拿按钮
- 从同一个缝纫工具上取下衬衫
- 僵局
因此,我已经对以下代码实施了锁定:
问题:
是否有必要实施secondLock?这是因为 firstLock 已经锁定了代码并阻塞了其他线程。
假设确实需要这两个锁,是否需要创建两个 ReentrantReadWriteLock 对象来提高并发性?我参考了这个链接 - http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
我确实阅读了线程和交错,但我不明白以下语句中“交错”的含义。有人可以用外行术语向我解释吗?
Quote: 没有理由阻止 c1 的更新与 c2 的更新交错
来源:http ://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
提前致谢!
java - Java ReentrantReadWriteLock - 正确用法?
我的 Web 应用程序存在一些并发问题,其中已完成对数据库的写入,并且可能还会同时读取。写入首先删除所有行,然后插入新行,因此可能会在数据库为空时完成读取,从而导致错误。我正在使用 ReentrantReadWriteLock,但想确保我正确使用它。任何修复将不胜感激。
java - ReadWriteLock 装饰器,这个代码线程安全吗?
我们正在我们的应用程序中构建由内存、文件和远程服务支持的缓存存储。希望避免显式同步以保持存储简单,同时使用装饰器解决阻塞等行为问题。
这是一个简单的缓存,这只是一个例子!
getDecorator()
get()
返回一个为and提供同步的装饰器,set()
同时允许装饰器在不知道为什么或如何刷新的情况下检查是否应该刷新键。我从这里得到了一个同步装饰器的想法。isKeyStale()
refreshKey()
问题:
- 假设
SimpleCache
只通过它的装饰器使用,代码是线程安全的吗? ReadWriteLock
在同步的类之外声明是不好的做法吗?SimpleCache.getDecorator()
确保缓存和装饰器实例之间的一对一映射,所以我假设这是可以的。
java - 使用 Java ReadWriteLock 同步缓存数据——是否将状态变量标记为 volatile?
Oracle的 ReadWriteLock javadoc及其实现描述了锁的作用以及如何使用它,但没有说明是否使用volatile
关键字。
这与do-all-mutable-variables-need-to-be-volatile-when-using-locks不是同一个问题,因为我很高兴锁将正确同步访问和可见性,但volatile
用于变量仍然是一个好主意,例如用于编译器优化或任何其他原因?
我的缓存数据由一个很少更改的List
和几个Maps
使用对象的各种属性映射列表中的对象组成。
最好的声明是什么?我有这个: