【问题标题】:implementing counting semaphore using java使用java实现计数信号量
【发布时间】:2010-01-25 23:20:50
【问题描述】:

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

但是当做如下实现时;

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

【问题讨论】:

  • 您是否知道java.util.concurrent 中已经存在SemaphoreCountdownLatch 类,或者您是否正在为作业重新实现这些东西?
  • 最有可能的作业,除非你在一个不允许并发的东西并且必须自己实现它的受限环境中做 java...

标签: java concurrency semaphore


【解决方案1】:

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

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

看看Semaphore,它提供派生类的顺序,例如FIFOSemaphore.

如果您需要有关书架的指导和参考,我推荐 "Concurrent Programming in Java",作者是 Doug Lea,他负责 util.concurrent 和为我们带来 java.util.concurrent 的 JSR。

【讨论】:

    【解决方案2】:

    您在这里还有很多其他问题需要处理(如果您尝试实现并发控制对象),但是解决您的具体问题的一个解决方案是:如何将等待/通知机制用于静态级别构造从构造中解开监视器的概念:您使用类的静态方法,但同步是在静态方法引用的对象(任何对象)的特定实例上执行的。例如:

    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();
              }
           }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 2016-08-19
      相关资源
      最近更新 更多