问题标签 [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 回答
4730 浏览

scala - scala 集合循环缓冲区

只是在这里搞乱,使用循环缓冲区。这是一个明智的实现,还是有更快/更可靠的方法给这只猫剥皮?

0 投票
3 回答
953 浏览

java - 在同一个 try 块中锁定多个 ReentrantReadWriteLock 是否安全?

假设我有两个关键资源,foo 和 bar。我用一些ReentrantReadWriteLocks保护他们

大多数操作只使用 foo OR bar,但其中一些恰好同时使用两者。现在,当使用单个锁时,您不能只这样做:

如果抛出异常,您的 foo 将永远锁定。相反,您将其包装起来,例如

但是,如果我需要同时处理这两个问题怎么办?把它们放在一个街区里安全吗?

选项1

或者是否有必要给每个锁自己的块:

选项 2

我不可能是第一个很难调查此问题的人......我知道选项 2 有“防弹”,但它也需要大量的维护。选项1可以接受吗?

0 投票
5 回答
36040 浏览

java - ReentrantReadWriteLock: what's the difference between ReadLock and WriteLock?

What I know is:

  • ReadLock and WriteLock affect each other somehow
  • WriteLock is just like synchronized
  • ReadLock seems cannot work alone
0 投票
1 回答
105 浏览

java - 线程不使用 Condition 等待新数据

我正在尝试为实验室编写一些程序,该实验室基本上是一个将数据存储在文件夹中的网络缓存,因此如果客户端想要打开网页,如果该页面不存在,该页面将存储在缓存文件夹中,并且它将显示给客户。我能够下载和显示页面,但是当线程必须等待时出现问题,因为请求的资源正在被下载并存储在缓存文件夹中。

下载类如下:

DownloadsNode 类如下:

缓存类如下:

以前的所有类都从以下类中使用:

有几点需要考虑:

-我必须在每个节点中创建条件变量,以便线程将因此等待并实现打开/关闭锁并保证互斥的方法。

- 如果一个线程正在下载其他线程感兴趣的资源,我使用条件变量等待,并在资源下载并存储在缓存中时说“停止等待”。我在那部分做错了什么?(所有这些都在 MainThread 类中)

-当保证互斥时,我是否必须将同步放在正确的方法中,执行以下方式: -Lock -synchronized(this) 并做我必须做的任何事情 -Unlock 还是我在两种方式都做同样的事情?在管理下载列表和缓存时,我必须建立批评区域,所以我认为有些部分在不需要的方法名称中添加同步,或者我错误地使用了读写锁。

注意:由于我翻译了变量和方法的名称以帮助理解,我可能写了一些不同的东西,但在我的程序中是正确的

非常感谢先进

0 投票
1 回答
263 浏览

java - ReentrantReadWriteLock 是否在 writeLock 锁定时读取?

我研究ReentrantReadWriteLock

我为测试编写了简单的代码(我知道使用 Thread.sleep() 不能保证可预测的结果,但我认为我很幸运:)):

输出:

10401 - 401 == 10000

10000 现在是写作时间。

据我了解,第二个读取线程在写入之前无法完成。因此写入和第二次读取并行执行。这对我来说不是可预测的行为。

你怎么看待这件事?

0 投票
1 回答
1951 浏览

java - 可重入读写锁。读写获取优先级

我研究 ReentrantReadWriteLock

来自 java 文档的片段:

直到当前等待的最早的写线程获得并释放写锁之后,该线程才会获得读锁

据我了解。

读取持续时间- 1 个时间单位

写入持续时间- 3 个时间单位

  1. 时间 0 - 获得写锁
  2. 时间 1 - 读锁尝试读
  3. 时间 2 - 写锁尝试写

因此,我期望以下顺序:

  1. 先写
  2. 第二次写

我的实验代码:

出去:

因此我得到

  1. 先写
  2. 第二次写

为什么我会得到这个结果?

是否可以打破 FIFO 排序?

更新

请比较 java doc 中的两个兄弟片段(关于公平模式):

第一的

如果持有写锁或存在等待写入线程,则尝试获取公平读锁(不可重入)的线程将阻塞。直到当前等待的最早的写线程获得并释放写锁之后,该线程才会获得读锁。当然,如果一个等待的写入者放弃它的等待,留下一个或多个读取线程作为队列中最长的等待者,并且没有写入锁,那么这些读取器将被分配读取锁。

第二:

除非读锁和写锁都空闲(这意味着没有等待线程),否则试图获取公平写锁(不可重入)的线程将阻塞。(请注意,非阻塞 ReentrantReadWriteLock.ReadLock.tryLock() 和 ReentrantReadWriteLock.WriteLock.tryLock() 方法不遵守此公平设置,如果可能,将获取锁,而不管等待线程。)

我不完全理解那里写的意思但是我看到ReentrantReadWriteLock使用不同的策略来获取读锁和写锁。我建议如果 java doc 中的政治相同,就不会写两个缩进。

ReadLock 可以共享锁。难道只有一个区别吗?

0 投票
0 回答
100 浏览

java - 在另一个 ReentrantReadWriteLock 中使用 ReentrantReadWriteLock

我不确定我是否正确实现了 ReentrantReadWriteLock,所以如果你能告诉我我是否做错了什么,我将不胜感激。

场景:想象一下制作一件衬衫需要两个步骤。衬衫都是一样的。

  1. 第一步,缝纫工具缝制衬衫
  2. 在第二步中,扣扣工具从第一步中取出衬衫并将扣子放在上面。为简单起见,每件衬衫上只会放置一个纽扣。

步骤 1 和步骤 2 分别使用总共 10 个缝纫工具和 10 个纽扣工具。这些按钮被保存在橱柜的不同架子上。

我的目标是确保尽可能多的并发性,同时确保线程不会:

  1. 从同一个架子上拿按钮
  2. 从同一个缝纫工具上取下衬衫
  3. 僵局

因此,我已经对以下代码实施了锁定:

问题:

  1. 是否有必要实施secondLock?这是因为 firstLock 已经锁定了代码并阻塞了其他线程。

  2. 假设确实需要这两个锁,是否需要创建两个 ReentrantReadWriteLock 对象来提高并发性?我参考了这个链接 - http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

  3. 我确实阅读了线程和交错,但我不明白以下语句中“交错”的含义。有人可以用外行术语向我解释吗?

Quote: 没有理由阻止 c1 的更新与 c2 的更新交错

来源:http ://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

提前致谢!

0 投票
1 回答
1784 浏览

java - Java ReentrantReadWriteLock - 正确用法?

我的 Web 应用程序存在一些并发问题,其中已完成对数据库的写入,并且可能还会同时读取。写入首先删除所有行,然后插入新行,因此可能会在数据库为空时完成读取,从而导致错误。我正在使用 ReentrantReadWriteLock,但想确保我正确使用它。任何修复将不胜感激。

0 投票
2 回答
309 浏览

java - ReadWriteLock 装饰器,这个代码线程安全吗?

我们正在我们的应用程序中构建由内存、文件和远程服务支持的缓存存储。希望避免显式同步以保持存储简单,同时使用装饰器解决阻塞等行为问题。

这是一个简单的缓存,这只是一个例子!

getDecorator()get()返回一个为and提供同步的装饰器,set()同时允许装饰器在不知道为什么或如何刷​​新的情况下检查是否应该刷新键。我从这里得到了一个同步装饰器的想法。isKeyStale()refreshKey()

问题:

  • 假设SimpleCache只通过它的装饰器使用,代码是线程安全的吗?
  • ReadWriteLock在同步的类之外声明是不好的做法吗?SimpleCache.getDecorator()确保缓存和装饰器实例之间的一对一映射,所以我假设这是可以的。
0 投票
3 回答
241 浏览

java - 使用 Java ReadWriteLock 同步缓存数据——是否将状态变量标记为 volatile?

Oracle的 ReadWriteLock javadoc及其实现描述了锁的作用以及如何使用它,但没有说明是否使用volatile关键字。

这与do-all-mutable-variables-need-to-be-volatile-when-using-locks不是同一个问题,因为我很高兴锁将正确同步访问和可见性,但volatile用于变量仍然是一个好主意,例如用于编译器优化或任何其他原因?

我的缓存数据由一个很少更改的List和几个Maps使用对象的各种属性映射列表中的对象组成。

最好的声明是什么?我有这个: