gpt4 book ai didi

java - 如何使用 java 信号量实现这种并发情况?

转载 作者:太空宇宙 更新时间:2023-11-04 07:47:44 24 4
gpt4 key购买 nike

我想使用java库提供的信号量来实现这个经典的厕所入口问题。

场景是:有一个公共(public)浴室,最多可供 4 名女性和 5 名男性使用,但不能同时使用。另外,虽然至少有一名女性在等待,但男性应该等待,以便女性更容易进入。

到目前为止,我已经对这个并发类进行了建模...

public class Concurrencia {

Semaphore mujeres; // Semaphore for women, initialized in 4
Semaphore hombres; // Semaphore for men, initialized in 5

public Concurrencia (Semaphore mujeres, Semaphore hombres) {

this.mujeres = mujeres;
this.hombres = hombres;

}

public synchronized void EntradaHombres () { // Method for men's entrance

if ( mujeres.availablePermits() == 4 && !mujeres.hasQueuedThreads() ) {
System.out.println("Entró un hombre al baño"); // Man gets in
try { hombres.acquire(); } catch (InterruptedException ex) { }
}
else {
System.out.println("Hombre en espera"); // Man should wait

}

}


public synchronized void EntradaMujeres () { // Method for women's entrance

if ( hombres.availablePermits() == 5) {
System.out.println("Entró una mujer al baño"); // Woman gets in
try { hombres.acquire(); } catch (InterruptedException ex) { }
}

else {
System.out.println("Mujer en espera"); // Woman should wait
}

}


public synchronized void SalidaMujeres () {

System.out.println("Salió una mujer del baño");
mujeres.release(); // Woman gets out
}

public synchronized void SalidaHombres () {

System.out.println("Salió un hombre del baño");
hombres.release(); // Man gets out
}

最佳答案

这可能有效:

首先,不偏袒女性

men = new Semaphore(5, true),    women = new Semaphore(4, true);

void manEnter() void womanEnter()
women.acquire(4); women.acquire(1);
men.acquire(1); men.acquire(5);
women.release(4); men.release(5);

void manExit() void womanExit()
men.release(1); women.release(1);

为了宠爱女人,男人成功后,一定要看看是否有女人在等待;如果有,他必须释放许可证并重试。我们无法使用women信号量的统计数据来检查该条件,因为男人也在等待women许可。我们可以引入一个 AtomicInteger 来记录等待的女性数量。信号量实际上可以用作原子整数。我们或许还可以利用女性的负面许可来表明有女性在等待。但这变得太复杂了,信号量可能不是解决这个问题的正确工具。

关于java - 如何使用 java 信号量实现这种并发情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14993740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com