java - 信号量锁的正确实现?

标签 java concurrency semaphore

我不确定以下实现是否正确。我的原因是,如果当前线程在等待收到信号时被中断,则 finally block 将被调用,但因为它没有持有锁,所以 IllegalMonitorStateException将被抛出。我是否实现了 try-finally在这种情况下正确阻止还是应该实现?

  public void acquire() throws InterruptedException {
    try {
      lock.lockInterruptibly();
      while (permits == 0) {
        condition.await();
      }
      permits--;
    }
    finally {
      lock.unlock();
    }
  }

最佳答案

不确定我是否正确理解问题,但您应该在分配资源后才尝试最终

  public void acquire() throws InterruptedException {
    lock.lockInterruptibly(); // allocate resource before try
    try {
      while (permits == 0) {
        condition.await();
      }
      permits--;
    }
    finally {
      lock.unlock();
    }
  }

我不知道为什么所有学校都这样做,例如Sun's official page on finally ,建议在 try 内进行分配(这样您就需要在 finally 子句中使用 if(allocated) {release})。在我看来,这是愚蠢的。为什么大家都建​​议配置里面试试?

关于java - 信号量锁的正确实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24087573/

相关文章:

java - google-services.json 是如何替换 default_web_client_id 的?

Java Thread.sleep() 实现

java - ConcurrentHashMap 和 Collections.synchronizedMap(Map) 有什么区别?

iphone - 互斥锁上的阻塞是否相当于空 while 循环?

Java读写锁需求,不同线程加锁和释放

java - 关于使用自定义字体【不能对非静态方法进行静态引用】

java - 计算二叉搜索树中的节点数

java - 将文本中的数据存储到变量中

java - 从 ActionPerformed 调用方法并在主线程上运行它

ios - 如何在objective-c ios中等待完成 block 完成