如何使用java信号量实现这种并发情况?
我想使用java库提供的信号量来实现这个典型的卫生间入口问题 场景是:有一个公共浴室,最多可供4名女性和5名男性使用,但不能同时使用。此外,虽然至少有一名女性在等待,但男性应该等待,以便女性更容易进入 到目前为止,我已经建模了这个并发类如何使用java信号量实现这种并发情况?,java,concurrency,semaphore,java.util.concurrent,Java,Concurrency,Semaphore,Java.util.concurrent,我想使用java库提供的信号量来实现这个典型的卫生间入口问题 场景是:有一个公共浴室,最多可供4名女性和5名男性使用,但不能同时使用。此外,虽然至少有一名女性在等待,但男性应该等待,以便女性更容易进入 到目前为止,我已经建模了这个并发类 public class Concurrencia { Semaphore mujeres; // Semaphore for women, initialized in 4 Semaphore hombres; // Semaphore for
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);
为了偏爱女人,男人成功后,他必须检查是否有女人在等待;如果有,他必须释放他的许可证,然后再试一次。我们不能使用女性
信号灯的统计数据来检查这种情况,因为男性也在等待女性
许可证。我们可以引入一个原子整数来记录等待的女性人数。信号量实际上可以用作原子整数。我们还可以利用女性的负面许可证来表明有女性在等待。但这变得太复杂了,信号量可能不是解决此问题的正确工具。这可能会起作用:
首先,不偏袒女性
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);
为了偏爱女人,男人成功后,他必须检查是否有女人在等待;如果有,他必须释放他的许可证,然后再试一次。我们不能使用女性
信号灯的统计数据来检查这种情况,因为男性也在等待女性
许可证。我们可以引入一个原子整数来记录等待的女性人数。信号量实际上可以用作原子整数。我们还可以利用女性的负面许可证来表明有女性在等待。这变得太复杂了,信号量可能不是解决这个问题的正确工具。这是一个奇怪的休息室:-pw你为什么要在EntradaMujeres
中获取hombre
信号量?我想使用信号量的全部意义在于你不需要同步的方法。如果所有的事情都是同步的,那么你可以假装所有的事情都发生在一个线程中。这是一个奇怪的休息室:-你为什么要在EntradaMujeres
中获取hombre
信号量?我想使用信号量的全部意义在于你不需要synchronized
方法。如果所有的事情都是同步的,那么你可以假装所有的事情都发生在一个线程中。