Java中是否有互斥体?

Java中是否有互斥对象或创建互斥对象的方法?我之所以问,是因为用1许可证初始化的信号量对象对我没有帮助。想想这个案例:

try {
   semaphore.acquire();
   //do stuff
   semaphore.release();
} catch (Exception e) {
   semaphore.release();
}

如果在第一次获取时发生异常,则 catch 块中的释放将增加允许,并且信号量不再是二进制信号量。

正确的方式会是正确的吗?

try {
   semaphore.acquire();
   //do stuff
} catch (Exception e) {
   //exception stuff
} finally {
   semaphore.release();
}

上面的代码会确保信号量是二进制的吗?


答案 1

Java 中的任何对象都可以用作使用块的锁。这也将在发生异常时自动负责释放锁。synchronized

Object someObject = ...;

synchronized (someObject) {
  ...
}

您可以在此处阅读有关此内容的更多信息:固有锁和同步


答案 2

请参阅此页面: http://www.oracle.com/technetwork/articles/javase/index-140767.html

它有一个稍微不同的模式,(我认为)是你正在寻找的:

try {
  mutex.acquire();
  try {
    // do something
  } finally {
    mutex.release();
  }
} catch(InterruptedException ie) {
  // ...
}

在这种用法中,您只是在成功后才呼叫release()acquire()


推荐