问题标签 [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 - ReentrantLock.lock() 不会阻塞其他线程
我很难理解 ReentrantLock.lock() 的行为
我有以下课程
我使用以下测试运行:
我本来预计会出现僵局。一旦 a() 方法调用 lock.lock(),我希望任何调用 b() 方法的人都必须在 b 的 lock.lock() 处等待,直到调用 a() 的线程调用 lock.unlock()。但是由于 a() 正在等待 b() 调用 condition.signalAll(),所以这两种方法都应该永远保持阻塞状态。
相反,这是我在控制台中得到的输出:
我对 lock() 和 unlock() 的正确使用和功能有什么误解?
java - 正确实施乒乓球比赛
我被要求执行 10 次正确调用“ping”和“pong”的乒乓球游戏(意思是在 ping 之前没有乒乓球)。意思是,控制台中的最终输出应该是:“ping!(1)”,“pong!(1)”,“ping!(2)”,“pong!(2)”等。
需求是实现带有信号量、reetrantlock 和倒计时锁存器的gamepingpongthread。
我的问题是打印顺序并不总是按照要求,我想知道我做错了什么。
这是代码:
提前致谢
java - eclipse中的可重入读/写锁有两种锁定/解锁方法
我注意到,在对 ReentrantReadWrite 锁调用 lock/unlock 时,我会提示我使用两种 lock 和 unlock 方法。
例如,在 WriteLock 中,我有一个带有 -75% 的 Lock() 和另一个没有 % 的 Lock()。两者都有相同的文档。我试图在网上找到原因,但找不到任何解释。它只是eclipse中的一个错误吗?
java - 查询可重入锁对同步块的缺点
我正在阅读 java 中可重入锁和同步块之间的比较。我正在浏览互联网上的各种资源。我发现在同步块上使用可重入锁的一个缺点是,在前一个中,您必须显式使用 try finally 块在 finally 块中获取的锁上调用 unlock 方法,因为您的代码的关键部分可能抛出异常会造成很大的麻烦,如果线程不释放锁,而在后一种情况下,JVM本身会负责在发生异常时释放锁。
我不太相信这个缺点,因为使用 try finally 块并不是什么大不了的事。因为我们已经使用它很长时间了(流关闭等)。有人可以告诉我重入锁相对于同步块的其他一些缺点吗?
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 - ReentrantReadWriteLock limit
Is there a limit to the ReentrantReadWriteLock? I'm now testing my application and it seems my write lock isn't giving out locks anymore (returning true: tryLock()
) when I'm at 20 threads.
java - 带锁的Java基本线程池实现.ReentrantLock
我是 Java 新手。我只是在试验线程,我想创建一个类似线程池的东西(如果这实际上是我正在做的......)。
基本上我有一个while循环,它会触发线程,直到还有要执行的任务&&而最大并发线程不大于n。每个线程使用 java.util.concurrent.locks.ReentrantLock 来提供一个锁,围绕任务计数变量在每个线程中减少,线程计数变量在线程开始时增加并在线程结束前减少(代码闻?):
当我运行代码时,新线程不断被触发,任务数只减少了两到三倍......
输出的最后几行(读取时间作为要执行的任务):
我确信我使用线程或锁的方式一定是完全错误的。但作为一个 java 新手,有很多东西我可能会错过(甚至可能是最基本的东西),一些帮助和一些让我回来在正确的道路上将不胜感激......!谢谢你。
我用它作为线程的参考:http: //tutorials.jenkov.com/java-concurrency/creating-and-starting-threads.html
然后这个 stackoverflow 回答看看如何使用 ReentrantLock:https ://stackoverflow.com/a/12510490/988591
这是闭包无法修改外部变量的解决方法(使用数组值): http ://c2.com/cgi/wiki?ClosuresThatWorkAroundFinalLimitation
java - 如何在使用 RentrantLock 完成所有三个地图的初始化之前避免读取并在更新完成后返回更新的地图集?
我正在尝试实现锁定,当我在我的三个地图上进行写入时,我希望通过该锁定来避免发生读取。所以我的要求是——
- 读取阻塞,直到第一次设置所有三个映射。
- 现在第二次,如果我要更新地图,我仍然可以返回所有三个旧地图值(在所有三个地图上完成更新之前),或者它应该阻止并在更新完成时返回所有新的三个地图值在所有三张地图上。
因为我有三个 Maps - primaryMapping
,secondaryMapping
所以tertiaryMapping
它应该返回三个更新地图的所有新值,或者它应该返回地图的所有旧值。基本上,在更新时我不想返回primaryMapping
旧值、secondaryMapping
新值和tertiaryMapping
新值。
它应该是一致的,要么应该返回旧值,要么应该在更新地图后返回新值。就我而言,地图更新将在三个月或四个月内发生一次。
下面是我ClientData
正在使用的课程,ReentrantLock
其中有整个逻辑 -
下面是我的后台线程代码,它将从我的服务 URL 获取数据,并在我的应用程序启动后每 10 分钟运行一次,然后它将解析来自 url 的数据并将其存储在ClientData
类变量中那三张地图。
我将在我的主应用程序的主线程中使用,getPrimaryMapping
和getSecondaryMapping
类,所以我想从这三个映射中返回所有新值集,或者如果发生更新,则阻止它并返回所有新值集更新完成后的那三张地图。getTertiaryMapping
ClientData
问题陈述:-
在我的代码库中,如上所示ClientData
,我想,一旦第一次设置地图,我将无法更新地图,因为这条线会导致问题,它会抛出异常,然后还有如何如上所示实施我的第二点?
我怎样才能成功地实现以上两点?我想,我在这里遗漏了一些非常小的东西?我想在这里使用 ReentrantLock,但也欢迎任何其他建议。我主要关心的是性能问题。因为我将在三个月内对这三张地图进行一次设置,所以这很好。但是每秒每 1000 个请求就会从主应用程序代码中获取三个地图,所以我想要非常快。
最初,我想删除这个 if 语句 -
但我怀疑,从那时起,当我更新地图时,线程之间的地图会不匹配?
这就是方式,我正在ClientData class
从主应用程序线程中读取值 -
更新:-
CountDownLatch
满足上述所有条件的另一种解决方案-
以下是我ClientData
正在使用的课程CountDownLatch
-
我将ClientData
像这样在主应用程序线程中使用类 -
这段代码对性能有影响吗?简而言之,哪一个会更好,我应该使用ReentrantReadWriteLock
还是上述CountDownLatch
一种解决方案?
所以现在的问题是,CountDownLatch
解决方案还是解决ReentrantReadWriteLock
方案?哪一个在高读/低写用例中表现更好?
如果可能的话,任何人都可以提供一个ReentrantReadWriteLock
基于我的上述解决方案的示例吗?这样,我将能够将性能与CountDownLatch
我之前的解决方案进行比较ReentrantReadWriteLock
。
因为我无法想出一个ReentrantReadWriteLock
用于上述用例的解决方案。
笔记:-
就我而言,写入将在三四个月内发生一次。但是读取将以非常高的速度从多个线程发生,1000
每秒请求数。所以它必须非常快。
java - Java - 如何修改信号量实现以使其公平
我正在使用 Java 中的 ReentrantLock 实现 SimpleSemaphore。
现在,我想为它添加一个公平标志,使其表现为一个公平\不公平的信号量,正如其构造函数中所定义的那样。
这是我的 SimpleSemaphore 代码,我很乐意提供一些关于如何开始实现公平性的提示。谢谢你。