Java 如何让一个线程获取2个信号量?(仅简单计数信号量)

Java 如何让一个线程获取2个信号量?(仅简单计数信号量),java,semaphore,Java,Semaphore,我正在做一个关于Java/Linux中信号量的典型家庭作业。有一桌咖啡、牛奶和糖,有不同类型的参与者在寻找这些材料的具体组合,当然还有负责重新装满未装满的容器的服务员 想象一个参与者想要咖啡和牛奶,他应该等待(被阻止),例如,如果有咖啡但没有牛奶。有没有什么方法可以让我同时使用(获取)2个信号量(s_anyMilk,s_anyCoffee)来阻止他的线程 没有这些,我脑子里只有一个愚蠢的死胡同: if(Main.s_anyCoffee.availablePermits()!=0 &&am

我正在做一个关于Java/Linux中信号量的典型家庭作业。有一桌咖啡、牛奶和糖,有不同类型的参与者在寻找这些材料的具体组合,当然还有负责重新装满未装满的容器的服务员

想象一个参与者想要咖啡和牛奶,他应该等待(被阻止),例如,如果有咖啡但没有牛奶。有没有什么方法可以让我同时使用(获取)2个信号量(s_anyMilk,s_anyCoffee)来阻止他的线程

没有这些,我脑子里只有一个愚蠢的死胡同:

if(Main.s_anyCoffee.availablePermits()!=0 &&
       Main.s_anyMilk.availablePermits()!=0)
    {
        Main.s_anyCoffee.acquire();
        Main.s_anyMilk.acquire();
        //do something here
        //Waiters will come later in their threads and refill containers
    }
else
{
//NO IDEA HERE!
}

别忘了,你可能会陷入僵局。例如,如果一个人拿着牛奶想要咖啡,另一个人拿着咖啡想要糖,第三个人拿着糖想要牛奶。汤姆,你说得对,但是如果有人想要咖啡和牛奶,只有当有不止一杯咖啡和一杯牛奶时,其他参与者才能要求。感谢您的通知。仅供参考,您的代码中存在竞争条件。具体来说,在调用
availablePermits()
acquire()
之间,许可证的数量可以改变。信号量获取将被阻塞,直到它们被获取为止,所以我不确定您到底想实现什么。@jason我正在寻找一种方法,一次通过一个线程获取两个信号量。更准确地说,我想知道除了创建第三个信号量,是否还有其他方法可以同时处理这两个信号量?我看不出有任何理由在信号量之外添加额外的同步。这就是信号量的工作方式,以及它们的用途。我认为你想得太多了。