3

我怀疑互斥量和信号量之间的显着区别在于计数信号量支持超过一次的最大访问,因为互斥量一次最多只支持一次访问。

但是在执行如下操作时;

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()?

4

2 回答 2

1

从概念上讲,您正在寻找一个信号量(使用一个许可初始化,行为等同于互斥体)。

如果您不能使用 J2SE 5.0,那么我建议您查看它的前身util.concurrent,它位于公共域中,可以在 J2SE 5.0 之前的 Java 版本上进行反向移植/使用(我也在有限的设备上使用了一些派生类) .

看一下Semaphore及其提供派生类的顺序,例如FIFOSemaphore

如果您需要书架的指导和参考,我推荐Doug Lea的“Java 中的并发编程”,他负责util.concurrent和为我们带来 java.util.concurrent 的 JSR。

于 2010-01-27T18:01:28.877 回答
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();
          }
       }
   }
}
于 2010-01-26T00:10:13.863 回答