2010-01-25 2 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' уже есть классы' Семафор' и 'CountdownLatch', или вы перепрограммируете этот материал для домашней работы? – skaffman

+0

, скорее всего, домашнее задание, если вы не делаете java в ограниченном env, который запрещает параллельный материал и должен его реализовать самостоятельно ... – Chii

ответ

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

Концептуально вы ищете семафор (который инициализируется с одного разрешения, ведет себя эквивалентно Mutex).

Если вы не можете использовать J2SE 5.0, я бы предложил проверить его предшественник util.concurrent, который находится в общедоступном домене и может быть использован для резервного копирования/использования на Java-версиях до J2SE 5.0 (я использовал некоторые производные классы на ограниченных устройствах как Что ж).

Посмотрите на Semaphore, и это предложение, предоставляющее производные классы, например. FIFOSemaphore.

Если вам нужны рекомендации и справочная информация для книжной полки, я рекомендую "Concurrent Programming in Java" от Doug Lea, который отвечал за util.concurrent и JSR, который принес нам java.util.concurrent.

Смежные вопросы