2013-02-21 55 views
1

我想使用java庫提供的信號量來實現這個經典的廁所入口問題。如何使用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 
} 
+3

這是一個奇怪的洗手間:-p – 2013-02-21 02:51:48

+1

爲什麼你在'EntradaMujeres'的'hombre'信號燈上獲取? – Perception 2013-02-21 03:02:11

+1

我想象一下,使用信號量的關鍵是你不需要'synchronized'方法。如果一切都是同步的,那麼你可以假裝所有事情都發生在一個線程中。 – 2013-02-21 03:06:28

回答

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中的負面許可來表示有等待的女性。儘管這樣變得過於複雜,但信號量可能不是解決此問題的正確工具。

相關問題