Tag: 信号量

java Semaphore北南阙

有两个孩子在等待在操场上使用环形交叉路口 – 一个是从北面朝下,一个是南面。 儿童只能从任一队列的前面进入环形交叉口,并且只有在有空位的情况下才可进入(每次只有一个孩子可以使用每个分段)。 一旦进入环形交叉路口,他们会随机使用它,然后随意离开东部或西部。 然后他们在其他地方随机游玩,之后,随机重新进入北/南队列,等等无限期。 环形交叉口顺时针旋转,排队的孩子将始终使用第一个空间…使用java信号量编写程序,通过一组代表子项的进程同步对共享环形交叉对象的访问。 这是我到目前为止所做的,不知道接下来该做什么。 我在Main class做什么? import java.util.Random; public class Child extends Thread { private Random random; private int which; private int number; public Child(int number) { this.number = number; random = new Random(); this.which = random.nextInt(2); } public void run() { //start point? } public int getNumber() { return number; […]

Java读写锁定要求,具有来自不同线程的锁定和释放

我试图找到一个不那么笨重的Java并发问题的解决方案。 问题的关键在于,当仍有工作线程处于活动状态时,我需要对块进行关闭调用,但关键的方面是每个工作任务都是异步生成和完成的,因此保持和释放必须由不同的线程完成。 一旦他们的工作完成,我需要他们以某种方式向关闭线程发送信号。 只是为了让事情更有趣,工作线程不能互相阻塞,所以我不确定信号量在这个特定实例中的应用。 我有一个解决方案,我认为安全地完成了这项工作,但是我对Java并发工具的不熟悉使我认为可能有一个更容易或更优雅的模式。 在这方面的任何帮助将不胜感激。 这是我到目前为止所做的,除了评论之外相当稀疏: final private ReentrantReadWriteLock shutdownLock = new ReentrantReadWriteLock(); volatile private int activeWorkerThreads; private boolean isShutdown; private void workerTask() { try { // Point A: Worker tasks mustn’t block each other. shutdownLock.readLock().lock(); // Point B: I only want worker tasks to continue if the shutdown signal // hasn’t already been […]

信号量如何以及为什么能够提供比初始化时更多的许可证?

我正在阅读Java Concurrency in Practice一书。 在有关java.util.concurrent.Semaphore的部分java.util.concurrent.Semaphore ,本书中包含以下行。 它是关于其“虚拟许可”对象的实现的评论 该实现没有实际的许可对象,并且Semaphore不会将分配的许可与线程相关联,因此在一个线程中获取的许cocoa以从另一个线程中释放。 您可以将acquire视为消费许可并将其release为创建许可; Semaphore不仅限于创建它的许可数量。 有人可以解释一下吗? 我无法理解这一点。 如果我们创建一个固定大小的池,我们创建固定数量的“许可”。 从上面的陈述看,“许可证”似乎可以继续增长。 为什么这样设计?

信号量和同步

我无法从javadocs中的信号量描述中理解以下内容。 请注意,调用acquire()时不会保持同步锁定,因为这会阻止项目返回到池中。 信号量封装了限制访问池所需的同步,与维护池本身一致性所需的任何同步分开。 有人可以帮助我理解这个及其影响。

使用Java在线程之间管道数据

我正在编写一个模仿电影院的multithreading应用程序。 涉及的每个人都是自己的线程,并发必须完全由信号量完成。 我唯一的问题是如何基本上链接线程,以便他们可以通信(例如通过管道)。 例如: 客户[1]是一个线程,获取一个信号量,让它走向票房。 现在,客户[1]必须告诉Box Office Agent他们想要看电影“X”。 然后BoxOfficeAgent [1]也是一个线程,必须检查以确保电影未满,并要么卖票或告诉客户[1]选择另一部电影。 如何在保持与信号量的并发性的同时来回传递数据? 另外,我可以在java.util.concurrent中使用的唯一类是Semaphore类。

信号量如何工作?

信号量可以低于0吗? 我的意思是,说我有一个N = 3的信号量,我叫“向下”4次,然后N将保持为0,但是一个进程将被阻止? 而另一方面,如果在一开始我打电话,N可以高于3吗? 因为正如我所看到的那样,如果N在开始时我可以多次调用3次,那么稍后我可以调用更多次,因此在关键部分放入更多进程然后信号量允许我。 如果有人为我澄清一点,我会非常感激。 格雷格

信号量与条件(ReentrantLock)之间的区别

有谁知道方法acquire ()和release () ( java.util.concurrent.Semaphore )和await ()和signal (new ReentrantLock().newCondition() )之间的区别。 你能为这些方法公开一个伪代码吗?

Binary Semaphore vs ReentrantLock

我一直在努力了解Reentrant锁和信号量(Reentrant锁与释放/解锁机制的嵌套)。 似乎有一个信号量要求你编写一个更彻底测试的应用程序,因为release()方法不检查释放许可证的线程是否实际上持有它。 当我测试我的测试代码时,我发现这可能随后增加超过初始限制的许可数量。 另一方面,如果一个线程在调用unlock方法时没有持有重入锁,我们会得到一个IllegalMonitorException。 所以说没有真正的理由拥有二进制信号量是正确的,因为二进制信号量可以做的一切也可以由ReentrantLock完成。 如果我们使用二进制信号量,我们必须检查整个方法调用堆栈以查看之前是否获得了许可证(如果有可能进行后续获取,它也会被释放 – 如果某个版本没有继续获取它可能会阻止它等等)。 此外,由于重入锁也为每个对象提供一个锁,因此更喜欢将重入锁定为二进制信号量并不总是更好吗? 我在这里查了一篇文章,讨论二进制信号量和互斥量之间的区别,但有没有像Java中的互斥量这样的东西? 谢谢,陈。 PS – 我在另一个论坛( http://www.coderanch.com/t/615796/threads/java/reason-prefer-binary-Semaphore-Reentrant )发布了这个问题,但我还没有收到回复。 我以为我也会在这里发布,看看我能得到什么。

同步的Vs信号量

在阅读Java中的并发性时,我有以下疑虑: Java是否提供较低级别的构造然后同步以进行同步? 在什么情况下我们会使用信号量而不是synchronized(它在Java中提供监视器行为)