首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中有互斥锁吗?

Java中有互斥锁吗?
EN

Stack Overflow用户
提问于 2011-03-14 01:22:14
回答 7查看 209.1K关注 0票数 122

java中有没有Mutex对象或者创建一个对象的方法?我之所以问这个问题,是因为用1许可初始化的信号量对象对我没有帮助。想一想这个例子:

代码语言:javascript
复制
try {
   semaphore.acquire();
   //do stuff
   semaphore.release();
} catch (Exception e) {
   semaphore.release();
}

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

正确的方式是什么?

代码语言:javascript
复制
try {
   semaphore.acquire();
   //do stuff
} catch (Exception e) {
   //exception stuff
} finally {
   semaphore.release();
}

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-03-14 01:25:50

查看此页面:http://www.oracle.com/technetwork/articles/javase/index-140767.html

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

代码语言:javascript
复制
try {
  mutex.acquire();
  try {
    // do something
  } finally {
    mutex.release();
  }
} catch(InterruptedException ie) {
  // ...
}

在这种用法中,您只能在acquire()成功之后调用release()

票数 121
EN

Stack Overflow用户

发布于 2011-03-14 01:25:54

Java中的任何对象都可以使用synchronized块作为锁。当发生异常时,这也会自动释放锁。

代码语言:javascript
复制
Object someObject = ...;

synchronized (someObject) {
  ...
}

你可以在这里阅读更多信息:Intrinsic Locks and Synchronization

票数 141
EN

Stack Overflow用户

发布于 2012-09-20 18:13:54

代码语言:javascript
复制
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


private final Lock _mutex = new ReentrantLock(true);

_mutex.lock();

// your protected code here

_mutex.unlock();
票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5291041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档