问题标签 [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.
kotlin - ReentrantReadWriteLock 在解锁时卡住
我有一个用于获取和释放文件锁的类。我使用一个 customKey 类,它只是一个带有 id 字符串的 ReentrantReadWriteLock(id 是文件)。出于某种原因,这仅在某些情况下有效,并且在大多数情况下它会挂起所有东西的解锁 - 我的调试器跟踪它一直使用到那里然后就卡住了。
我究竟做错了什么?如果一个线程崩溃并且没有释放它的锁,我会得到,但是这里一个线程试图调用解锁并且没有进一步。
这是锁定的方法:
这是释放的方法:
请不要费心谈论架构,这是由作业决定的。另外请忽略 ownerId 和 sequence 变量。
编辑:我尝试只使用一个锁,虽然效率不高,但它确实有效,所以@gidds 可能在某些东西上,但 ConcurrentHashMap 和 ConcurrentLinkedQueue (替换 List 更简单)都没有解决问题。
EDIT2:这是我使用 ConcurrentHashMap 的新类。它仍然无法正常工作,谁能指出我搞砸了?谢谢
}
EDIT3:获取的新实现:
和释放:
还是同样的失败
java - 如何使用 StampLocks 处理重入
我正在将带有可重入锁的代码转换为印章锁。该代码由一个场景组成,readlock
如下writelock
例所示。
邮票锁不可重入。然后,如果我更改readLock()
为in stamp locks,则可能会出现死锁情况。tryOptimisticRead()
writeLock()
writeLock()
因此,我想知道如何使用邮票锁来处理这种情况。
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 个线程正在等待对方。ReentrantReadWriteLock
doSomething()
我可能完全错了,但如果到目前为止没有错,我不确定这个实例是如何ReentrantReadWriteLock
知道引用它的 Worker 实例被另一个线程锁定的?
似乎当计划Runnable task
运行时,即使scheduleTask
方法返回,Utils 类仍然被锁定?
更新了scheduleTask
使用 0 秒延迟以更接近实际情况。
感谢您花时间考虑这个问题!
java - 使用可重入读写锁是最快的方法吗?
对于股票市场算法,我正在实现一个可观察的模式来处理报价。“观察者”是触发器列表。问题是这个列表可以改变(添加触发器、删除触发器等),所以我必须处理并发修改错误。
我肯定不想在列表或 copyOnWriteArrayList 上使用同步,因为这太慢了。报价的处理需要异步。如果列表发生变化,我只想锁定列表。我正在考虑使用 ReentrantReadWriteLock。当列表需要改变时,获取写锁。如果处理报价,请使用读锁。这是处理这个问题的最佳方法吗?我的目标是完全异步处理引号,但是如果我需要修改它就锁定列表
java - 如何使用可重入读写锁仅锁定 Hashmap 中的一项
我在以下实现中使用 ReentrantReadWriteLock
它工作正常,但这里的问题是每当我想添加或更新一个值时,整个 Map 都被锁定并且效率不高,我如何编辑代码以使其仅锁定正在修改的值。例如,如果我想通过调用来更新值 A ;
该值被锁定,在通过 update 方法更新之前,其他线程无法读取或修改它,但同时可以修改具有不同键的其他值。
有关如何使用读写锁仅锁定地图中的一项(如果正在修改而不是锁定整个地图)的任何提示?
java - ReadWriteLock 不会被解锁
我在这段代码中有一个死锁,但我不明白为什么。
有3个班和主班。
这是一个阅读器类:
这是作家B:
这是作家A:
当我运行主类时,有时所有类都在那里工作,但是当 Writer B 启动时它陷入死锁。
坏情况控制台输出:
好案例控制台输出:
java - 与 Java 中的 lock() 相比,lockInterruptibly() 的优势
在尝试使用 Java 的 ReentrantReadWriteLock() 使数据结构(类)线程安全时,我偶然发现了这两种方法。
lock() - 非中断模式: 我们在非中断模式下获取锁,这意味着即使队列中等待的线程被中断或取消驻留,它也会简单地重试获取锁。这继续,导致线程的阻塞和解除阻塞,直到它获得锁。
lockInterruptibly() - 可中断模式: 在这种情况下,如果正在等待的线程被其他线程中断,它将导致 InterruptedException,因此不会有任何重试。
现在我的问题是:
- 当我希望我的线程可中断时,我必须使用 lockInterruptibly() 吗?
- 除了可以以某种方式处理 InterruptedException 这一事实之外,为什么使用 lockInterruptibly() (优点)是有意义的?
- 在性能等方面使我的线程可中断是否有益?
感谢您的帮助:)
[主要来源:https://www.javarticles.com/2016/06/java-reentrantlock-interruption-example.html]