Реализация подсчета семафора с использованием Java - PullRequest
3 голосов
/ 26 января 2010

Я подозреваю, что существенное различие между мьютексом и семафором состоит в том, что счетный семафор поддерживает максимальный доступ больше, чем один, поскольку мьютекст поддерживает не более одного доступа одновременно.

Но при выполнении реализации следует:

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 () сами?

Ответы [ 2 ]

1 голос
/ 27 января 2010

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

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

Взгляните на Семафор и его порядок, обеспечивающий производные классы, например, FIFOSemaphore .

Если вам нужны руководство и справочник по книжной полке, я рекомендую «Параллельное программирование в Java» Дуга Ли, ответственного за util.concurrent и JSR, которые принес нам java.util.concurrent.

0 голосов
/ 26 января 2010

Здесь вам нужно решить множество других проблем (если вы пытаетесь реализовать объект управления параллелизмом), но одним из решений вашей конкретной проблемы использования механизма ожидания / уведомления для конструкции статического уровня является просто распутать понятие монитора из конструкции: вы используете статические методы вашего класса, но синхронизация выполняется для конкретного экземпляра объекта (любого объекта), на который ссылаются статические методы. Например:

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();
          }
       }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...