1

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

场景是:有一个公共浴室,最多可供 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
}
4

1 回答 1

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);

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

于 2013-02-21T06:30:59.267 回答