当前位置: 首页 > 知识库问答 >
问题:

为什么Java允许用负许可初始化信号量?

殷烨
2023-03-14

在信号量(java.util.concurrent.Semaphore)初始化期间,我没有得到负许可背后的基本原理。

我知道调用release()方法最终可能会使信号量的许可证大于等于1(

然而,我没有得到任何实际的用例,在这种情况下,我将使用负许可初始化信号量。

参考样本代码

import java.util.concurrent.Semaphore;

public class SemaphoreDemo {

    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        Semaphore s = new Semaphore(-2);
        System.out.println(s.availablePermits());
        s.release(3); // adding 3 permits
        System.out.println(s.availablePermits()); // now it has 1 permit        
    }
}

共有2个答案

闾丘德宇
2023-03-14

为什么java不允许在信号量构造函数中使用负数?信号量只是一种限制访问某些资源的机制。如果我们想从一开始就限制访问,我们最好用一个负值初始化信号量,并确保现在没有线程会接触到该资源。

javadoc明确指出:

@param允许可用许可的初始数量。

该值可能为负值,在这种情况下,必须在授予任何收购之前进行发布。

您可能会遇到这样的情况,从一开始,您就需要等待一些资源打开并变得可用,然后才能开始使用它。

例如:假设您有3个线程正在构建您需要处理的文件。此操作需要时间。一旦所有3个线程都完成,只有这样您才能继续工作。您必须等待这三个线程释放信号量才能继续工作。现在,这可能不是一个很好的写入解决方案,但至少可以使用负许可的初始信号量。

这里发布了另一个具有相同咒语的示例

汝承载
2023-03-14

如果您知道在创建信号量时某些资源已经在使用,那么它可能会很有用。例如,初始化中使用的资源。

 类似资料:
  • 我遇到了下面的Java代码,起初看起来不错,但从未编译过: 下面是IDE :变量USER_ID可能已分配的错误消息。 将值赋值给静态最终变量有问题吗?

  • 问题内容: Java为什么不允许从静态初始化块中引发检查异常?这个设计决定背后的原因是什么? 问题答案: 因为无法在源中处理这些检查的异常。您对初始化过程没有任何控制,并且无法从源代码中调用static {}块,因此可以用try-catch包围它们。 由于您无法处理检查异常指示的任何错误,因此决定禁止抛出检查异常静态块。 静态块不得抛出已检查的异常,但仍允许引发未检查的/运行时异常。但是根据上述原

  • 问题内容: 题 苹果的文档指定: 首次初始化属性时,不会调用willSet和didSet观察器。仅当在初始化上下文之外设置属性的值时才调用它们。 是否可以强制在初始化期间调用它们? 为什么? 假设我有这堂课 我创建了method ,以使处理调用更简洁,但我只想处理函数中的属性。有没有办法在初始化过程中强制此调用? 更新资料 我决定只为我的类删除便捷的初始化器,并强迫您在初始化后设置属性。这使我知道

  • 问题内容: 我经常发现自己想要这样做。当您要存储一些有用的信息或其他状态时,它可能非常有用。 所以我的问题是,是否有很好的理由来禁止这样做? 谢谢 编辑:非常感谢所有这些答案。因此,听起来这没有正确或错误的答案。 假设我接受这些类都不是子类的事实,那么 不 将Control类标记为final,而是禁止子类的意义是什么-有效地将异常/错误从编译时降级为运行时? 编辑^ 2:对此,请参阅我自己的回答:

  • 问题内容: 我读了这个问题,并认为如果可以写的话,很容易解决(不是没有它就不能解决): 我不确定在很多情况下它是否有用,但是我想知道为什么它没有用,以及其他语言中是否存在类似的东西。 你们有什么感想? 编辑: 澄清一下:是的,我知道,这在Java中是不可能的,我也不是很想念它。这不是我期望的工作,并且惊讶于出现编译器错误。我只是有这个主意,喜欢讨论它。 问题答案: 它违反了封装。你不应该能够绕过父

  • 问题内容: 我正在处理Android项目,但遇到了我无法理解的错误: 此处不允许使用数组初始化程序 我试图简化我的代码,这归结为 这里发生了什么? 问题答案: 你应该用 您只能在变量初始化时使用缩写语法。