1

Java ライブラリが提供するセマフォを使用して、この古典的なトイレの入り口の問題を実装したいと考えています。

シナリオは次のとおりです。最大 4 人の女性と 5 人の男性が同時に使用できない公衆トイレがあります。また、待っている女性が少なくとも 1 人いますが、女性が簡単に入場できるように、男性は待つ必要があります。

これまでのところ、この同時実行クラスをモデル化しました...

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 に答える