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

kotlin - ReentrantReadWriteLock 在解锁时卡住

我有一个用于获取和释放文件锁的类。我使用一个 customKey 类,它只是一个带有 id 字符串的 ReentrantReadWriteLock(id 是文件)。出于某种原因,这仅在某些情况下有效,并且在大多数情况下它会挂起所有东西的解锁 - 我的调试器跟踪它一直使用到那里然后就卡住了。

我究竟做错了什么?如果一个线程崩溃并且没有释放它的锁,我会得到,但是这里一个线程试图调用解锁并且没有进一步。

这是锁定的方法:

这是释放的方法:

请不要费心谈论架构,这是由作业决定的。另外请忽略 ownerId 和 sequence 变量。

编辑:我尝试只使用一个锁,虽然效率不高,但它确实有效,所以@gidds 可能在某些东西上,但 ConcurrentHashMap 和 ConcurrentLinkedQueue (替换 List 更简单)都没有解决问题。

EDIT2:这是我使用 ConcurrentHashMap 的新类。它仍然无法正常工作,谁能指出我搞砸了?谢谢

}

EDIT3:获取的新实现:

和释放:

还是同样的失败

0 投票
0 回答
44 浏览

java - 如何使用 StampLocks 处理重入

我正在将带有可重入锁的代码转换为印章锁。该代码由一个场景组成,readlock如下writelock例所示。

邮票锁不可重入。然后,如果我更改readLock()为in stamp locks,则可能会出现死锁情况。tryOptimisticRead()writeLock()writeLock()

因此,我想知道如何使用邮票锁来处理这种情况。

0 投票
1 回答
66 浏览

java - 在另一个线程上获取 ReentrantReadWriteLock.ReadLock 时调用对象的同步方法

感谢您考虑我的问题,我认为这实际上是在问:

不太确定下面的代码到底是如何死锁的。


结构大致如下所示,有2 个类

  • 主类 -具有同步方法的Worker
  • 具有类级同步方法的util 类

Worker的run方法会死锁,doSomething()不同步可以避免死锁。


实际应用程序的线程转储显示:

“Worker”线程被阻塞-等待监视器锁定
-> int v = Utils.getIntValue();

“计划”线程正在等待 -此处的线程状态详细信息
--> 在 readWriteLock.readLock().lock() 之后的(ReentrantReadWriteLock 的内部代码);

我认为这是由于静态同步方法scheduleTask锁定了整个Utils类,然后在线程ExecutorService可以获取内部 WorkerReadLock之前,另一种 Worker 方法锁定在 Worker 对象(内在锁)上,因此 2 个线程正在等待对方。ReentrantReadWriteLockdoSomething()


我可能完全错了,但如果到目前为止没有错,我不确定这个实例是如何ReentrantReadWriteLock知道引用它的 Worker 实例被另一个线程锁定的?

似乎当计划Runnable task运行时,即使scheduleTask方法返回,Utils 类仍然被锁定?



更新scheduleTask使用 0 秒延迟以更接近实际情况。


感谢您花时间考虑这个问题!

0 投票
0 回答
26 浏览

java - 使用可重入读写锁是最快的方法吗?

对于股票市场算法,我正在实现一个可观察的模式来处理报价。“观察者”是触发器列表。问题是这个列表可以改变(添加触发器、删除触发器等),所以我必须处理并发修改错误。

我肯定不想在列表或 copyOnWriteArrayList 上使用同步,因为这太慢了。报价的处理需要异步。如果列表发生变化,我只想锁定列表。我正在考虑使用 ReentrantReadWriteLock。当列表需要改变时,获取写锁。如果处理报价,请使用读锁。这是处理这个问题的最佳方法吗?我的目标是完全异步处理引号,但是如果我需要修改它就锁定列表

0 投票
0 回答
52 浏览

java - 如何使用可重入读写锁仅锁定 Hashmap 中的一项

我在以下实现中使用 ReentrantReadWriteLock

它工作正常,但这里的问题是每当我想添加或更新一个值时,整个 Map 都被锁定并且效率不高,我如何编辑代码以使其仅锁定正在修改的值。例如,如果我想通过调用来更新值 A ;

该值被锁定,在通过 update 方法更新之前,其他线程无法读取或修改它,但同时可以修改具有不同键的其他值。

有关如何使用读写锁仅锁定地图中的一项(如果正在修改而不是锁定整个地图)的任何提示?

0 投票
0 回答
40 浏览

java - ReadWriteLock 不会被解锁

我在这段代码中有一个死锁,但我不明白为什么。

有3个班和主班。

这是一个阅读器类:

这是作家B:

这是作家A:

当我运行主类时,有时所有类都在那里工作,但是当 Writer B 启动时它陷入死锁。

坏情况控制台输出:

好案例控制台输出:

0 投票
0 回答
26 浏览

java - 与 Java 中的 lock() 相比,lockInterruptibly() 的优势

在尝试使用 Java 的 ReentrantReadWriteLock() 使数据结构(类)线程安全时,我偶然发现了这两种方法。

lock() - 非中断模式: 我们在非中断模式下获取锁,这意味着即使队列中等待的线程被中断或取消驻留,它也会简单地重试获取锁。这继续,导致线程的阻塞和解除阻塞,直到它获得锁。

lockInterruptibly() - 可中断模式: 在这种情况下,如果正在等待的线程被其他线程中断,它将导致 InterruptedException,因此不会有任何重试。

现在我的问题是:

  1. 当我希望我的线程可中断时,我必须使用 lockInterruptibly() 吗?
  2. 除了可以以某种方式处理 InterruptedException 这一事实之外,为什么使用 lockInterruptibly() (优点)是有意义的?
  3. 在性能等方面使我的线程可中断是否有益?

感谢您的帮助:)

[主要来源:https://www.javarticles.com/2016/06/java-reentrantlock-interruption-example.html]