繁体   English   中英

在java中使用信号量并存储到数组中

[英]Using Semaphores in java and storing into array

我是使用信号量的新手,所以请耐心等待。 所以,假设我有 7 个许可证要发放,总共有 49 个人(线程)在等待它们。 如果我获取()前 7 个人的信号量并将它们存储到列表数组中(存储人的信号量),例如通过将它们传递到另一个类。 然后,如果我回到该数组并循环并释放()该其他类中的信号量,那不应该触发其他线程等待获取下一个键吗? 因为我刚刚编写的代码做到了这一点,接下来的 7 个线程没有获取密钥。 我没有发布代码,因为我只是想从概念上了解我错过了什么,然后实现它。

如果您想要一次最多有 7 个线程处于活动状态,则只需要 1 个信号量,如下所示:

Semaphore available = new Semaphore(7, true);

让您的每一个线程呼叫available.acquire()(最终available.release()),对这个非常旗语实例(由所有线程共享),那就是它。

这是 java.util.concurrent.Semaphore javadoc 所说的:

计数信号量。 从概念上讲,信号量维护一组许可。 如有必要,每个acquire() 都会阻塞,直到获得许可为止,然后获取它。 每个 release() 添加一个许可,可能会释放一个阻塞的获取者。 但是,没有使用实际的许可对象; 信号量只是计算可用的数量并相应地采取行动。

如果您正在获取信号量,请务必在某个时候释放它。 前伪代码:

sem = Semaphore.new(2, true)
Thread1 { 
    sem.acquire()
    // Do something
    sem.release()
    }; 
Thread2 { 
    sem.acquire()
    // Do something
    sem.release()
    }
Thread3 { 
    //blocked until one of the first two Thread releases. 
    sem.acquire()
    // Do something
    sem.release()
    }

这增加了齐柏林飞艇的观点......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM