问题标签 [reentrantlock]
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 - Java - 静态方法上的可重入 WriteLock
如何使用WriteLock
一个static
方法?这就是我所拥有的:
m_unitWriteLock
定义为静态的正确方法吗?你对这种情况有什么建议?tnx。
java - java.concurrent.ReentrantLock - 为什么我们要多次获取同一个锁
我知道如果使用 ReentrantLock,它允许同一个线程多次获取同一个锁。在内部,它有一个计数器来计算获得锁的次数。如果您两次获得相同的锁,则需要释放两次。但我的问题是,为什么有人要多次获取锁,一次获取就足够了吗?有人可以给我一个常见的用例吗?
objective-c - 如何通过GCD在objective-c中实现可重入锁机制?
我有一个带有一些方法的objective-c 类,它使用GCD 队列来确保对资源的并发访问是串行发生的(执行此操作的标准方法)。
其中一些方法需要调用同一类的其他方法。所以锁定机制需要是可重入的。有没有标准的方法来做到这一点?
起初,我使用了这些方法中的每一个
同步访问。如您所知,当其中一个方法调用另一个这样的方法时,会发生死锁,因为 dispatch_sync 调用会停止当前执行,直到执行另一个块,这也无法执行,因为队列上的执行已停止。为了解决这个问题,我使用了例如这个方法:
在我的每一种方法中,我都使用
我不喜欢这个解决方案,因为对于每个具有不同返回类型的块,我需要编写另一个方法。此外,这个问题对我来说很常见,我认为应该有一个更好的标准解决方案。
java - 如何在 java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:127) 处避免 IllegalMonitorStateException
我只希望一个线程同时修改一个策略,不同的策略可以同时修改。像这样的代码:
在主函数中运行上述代码时
它可以工作,但是当我在 Web 应用程序中使用它时,函数 throw IllegalMonitorStateException
。
有人可以帮助我吗?
谢谢。
java - ReentrantLock - unlock() 方法似乎不适用于列表
我正在编写一个必须以两种方式修改列表的程序。尽管此实现完美运行,但它无法让第二个线程获取锁:
也许有人知道这是为什么?
java - 优先获取可能被锁定的公平 ReentrantLock
我有一个 ReentrantLock,一堆操作正在锁定,它是用new ReentrantLock(true)
. 有没有办法让线程“闯入”锁并在释放之后但在任何其他线程之前获取它?
我考虑了 timed 和 untimed 的各种组合tryLock
:
tryLock()
如果它已经解锁并且线程正在等待,它本身将插入锁,但不会等待锁变得可用。- 与超时相同的方法是公平的。
- 将两者结合起来是行不通的,因为如果它在开始时被锁定,基于超时的 tryLock 将退回到公平调度。
还是我错了?
java - ConcurrentHashMap 中写入顺序的 FIFO
我的 CHM 已经包含以下数据 ->
1 苹果
2 香蕉
3 猫
4 狗
1,2,3,4 是键,Apple,banana... 是键。
如果 3 个线程 t1, t2, t3 想要修改相同的现有记录 [3 Cat] 。我需要按 FIFO 顺序写入。[然后将执行一些操作。Ex Logging to keep record of value change pattern] 我检查了现有的源代码,它不保证 FIFO 写入。在源代码锁定是在一个段上执行的。以下是 CHM 类中的源代码
Segment Class 调用不提供公平锁定机制的 ReentrantLock 的 Default 构造函数。
如果我编写我的新 CHM 课程并进行以下更改
super(true) 将调用 ReEntrantLock 的以下构造函数
我认为这将使 sagment 锁定操作公平,并且写入操作将按 FIFO 顺序执行。请提出您的意见。
java - 线程共享的 ReentrantLock 似乎不支持锁
我有一个在线程之间共享的 ReentrantLock 对象,但我可以通过不同的线程锁定同一个对象。这似乎不对,因为它们是不同的线程。这是截断/简化的输出:
我的日志记录结构如下:
如你看到的:
- [http-bio-8080-exec-9] 锁定(保持计数为 0,然后按预期锁定后为 1)
- [Camel thread #1] 锁定(为什么这可能因为 [http-bio-8080-exec-9] 尚未解锁?)
MyProcessor 被调用作为消息到达队列的结果。该lock
对象在其构造函数中传递给 MyProcessor。当我在上面的日志中打印出锁定对象时,您可以看到它是同一个对象(具有相同的参考 ID)。
有任何想法吗?
谢谢!
java - Interleaved ReentrantLocks(用于 3D 摄像机移动,LWJGL)
我的问题是,对于特定情况,交错多个 ReentrantLocks 是否是一个相当有效的选择:3D 空间中的相机移动(LWJGL,openGL)——当然是图形表示。
我的相机控制器对象拥有一个私有方法来操作模型视图矩阵 ( lookThrough()
),因此我可以在 3D 空间中“行走”和“旋转”用户视图。walkForward()
它包含允许其他类/对象更改与运动相关的变量(pitch
、、、 )的公共方法(即yaw
)position
。现在,用于用户控件的对象/线程不断更改position
以及yaw
和pitch
. 同时,主窗口(图形)通过使用 - 方法将位置和旋转因子应用于模型视图矩阵lookThrough()
。所有相机移动方法和模型视图矩阵的操作都使用前面提到的一个或所有空间变量。
这是在限制并发线程访问之前提到的相机控制器对象的两个方法。它们清楚地显示了访问相同变量的问题,而相机移动和模型视图矩阵的操作可以同时发生:
为了限制线程对我假设给定线程的这些变量的访问,Java 的标准Lock
或ReentrantLock
Java 类可以完成这项工作。我可以为每个空间变量创建锁,也可以创建一个来统治它们。假设我要采用多重 ReentrantLock 方法,我无法正确锁定和解锁所有锁定对象。我应该像下面的例子那样做:
或者在多个try-finally-blocks中交错锁更可取:
第二个例子对我来说看起来很尴尬。因此,我会选择第一种以较少交错方式锁定和解锁的方法。也许最好只使用一个锁来管理线程访问。这样,锁定和解锁将很简单。在超过一半的情况下,无论如何都会同时访问所有空间变量。也许我可以在使用 - 方法时简单地忽略锁lookThrough()
。用户通过“相机”查看的视图不是线程安全的,但是实际的相机位置是。结果,用户的视图不能被它完全破坏。
足够多的混乱-为简单起见,以下是我总结的主要问题:
- 你会交错锁还是重入锁?在这种特定情况下?
- 当“同时”使用多个锁时,您将如何实际设计代码(我知道这不完全相同)?
- 将信号锁对象汇总到一个锁中以将它们全部锁定是否可取?
- 如果我跟踪在每个渲染循环中应用于该矩阵的实际“相机”位置和旋转,我可以在操作 openGL/LWJGL 中的模型矩阵时简单地忽略使用锁吗?
谢谢你的建议!