【问题标题】:What is a blocking semaphore in Java?什么是 Java 中的阻塞信号量?
【发布时间】:2018-02-22 10:05:06
【问题描述】:

根据我的理解,阻塞信号量被初始化为零而不是一,其工作方式是任何执行 P(S) 操作的线程都会阻塞,直到首先被 V(S) 释放。

谁能用一个例子解释这个机制,任何帮助将不胜感激

【问题讨论】:

    标签: java semaphore


    【解决方案1】:

    一个阻塞信号量

    java.util.concurrent.Semaphore 类同时支持阻塞和非阻塞操作。

    阻塞信号量初始化为零而不是一

    您设置了初始许可数。如果将permits 设置为1 (new Semaphore(1)),则可以在release 之前acquire 一次。

    • 如果值为> 0,则一些acquires 可能发生在releases 之前。
    • 如果值为<= 0,则必须在调用acquire 之前出现一些release

    记录在JavaDoc:

    此值可能为负数,在这种情况下,必须在授予任何获取之前进行释放。


    class Example {
    
        public static void main(String[] args) throws InterruptedException {
            final Semaphore s1 = new Semaphore(0);
            s1.acquire(); 
            // the thread is disabled
            // no permit is available
            // a blocking operation
    
            final Semaphore s2 = new Semaphore(1);
            s2.acquire();
            // returns immediately
            // one permit was available
    
            final Semaphore s3 = new Semaphore(0);
            if (s3.tryAcquire()) {
                // a non-blocking operation
                // returns false immediately
            }
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      引用 Semaphare 类的javadoc

      permits - 可用许可的初始数量。此值可能为负数,在这种情况下,必须在授予任何获取之前进行释放。

      还有:

      如果有必要,每个 acquire() 会阻塞,直到获得许可,然后再接受它。每个 release() 添加一个许可,可能会释放一个阻塞的获取者。

      因此,假设您使用 -1 进行初始化,信号量将阻止 acquire() 调用,直到 release() 进来。

      从这个意义上说:您只需执行semaphore = new Sempahore(-1),您会发现semaphore.acquire() 将阻塞,直到其他线程完成semaphore.release() 调用。

      这就是全部。

      【讨论】:

        猜你喜欢
        • 2016-08-02
        • 2016-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多