2013-02-21 29 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中的负面许可来表示有等待的女性。尽管这样变得过于复杂,但信号量可能不是解决此问题的正确工具。

相关问题