2010-01-25 102 views
3

我懷疑互斥量和信號量之間的顯着差異在於計數信號量支持最大訪問次數不止一次,因爲mutext一次最多隻支持一次訪問。使用java實現計數信號量

但是在執行時如下;

public class countingSemaphore{ 
private static final int _MOSTTABLES = 3; // whatever maximum number 
private static int availtable = _MOSTTABLES; 

public synchronized static void Wait(){ 
    while(availtable==0){ 
    try{ 
    wait();  
    } 
    catch(InterruptedException e){ 
    e.printStackTrace(); 
    } 
    } 
    availtable--; 
} 

public synchronized static void Signal(){ 
    while(availtable==_MOSTTABLES){ 
    try{ 
    wait(); 
    } 
    catch(InterruptedException e){ 
    e.printStackTrace(); 
    } 
    } 
    availtable++; 
} 
} 

問題是調用了對象的非靜態wait()方法。但是,我必須將同步應用於類而不是對象實例,因爲訪問是在多個實例之間共享的。

如何解決wait()錯誤?我們在java中有另一種方法,或者我們必須自己實現wait()嗎?

+8

您是否知道'java.util.concurrent'中已經有'Semaphore'和'CountdownLatch'類,或者您是否正在重新實現這些作業? – skaffman 2010-01-25 23:24:34

+0

最有可能的功課,除非你是在一個受限制的ENV它不允許併發的東西做Java,並有實現它自己... – Chii 2010-01-26 04:14:15

回答

0

在這裏有很多其他問題需要處理(如果您試圖實現併發控制對象),但針對您的特定問題的一個解決方案是簡單地使用等待/通知機制解開從結構顯示器的概念:您使用類的靜態方法,但同步在由靜態方法引用的對象(任何物體)的特定實例執行。例如:

public class MySemaphore { 
    // ... 
    private final Object lock = new Object(); 

    public static void acquire(int count) { 
     while(...) { 
      synchronized(lock) { 
       lock.wait(); 
      } 
     } 
    } 
    public static void release(int count) { 
     while(...) { 
      synchronized(lock) { 
       lock.notifyAll(); 
      } 
     } 
    } 
} 
1

從概念上講,你正在尋找一個信號量(其中一個許可初始化,表現相當於一個互斥)。

如果您無法使用J2SE 5.0,那麼我建議檢查出它的前身util.concurrent,這是在公共領域,可以回遷/ J2SE 5.0之前的Java版本使用(我用有限的設備如一些派生類好)。

看看Semaphore,它是提供派生類的訂單,例如FIFOSemaphore

如果您需要書架的指導和參考,我推薦由Doug Lea編寫的"Concurrent Programming in Java",他負責util.concurrent以及爲我們帶來java.util.concurrent的JSR。