Monitor.TryEnter在Java中等效

时间:2012-12-07 20:45:02

标签: java multithreading thread-safety

如果某个线程在java中通过此方法拥有,如何跳过方法,我知道.net中存在Monitor.TryEnter,我可以通过以下方式实现:

if(Monitor.TryEnter()){
 //do work
}
//else skip

但是我如何在java中实现这种行为,在java中是Monitor.TryEnter的任何等价物。

2 个答案:

答案 0 :(得分:5)

ReentrantLock#tryLock()会为你效力吗?

它有你想要的行为,但是它需要一个显式的锁对象,因此它不能与嵌入式Java对象监视器一起工作 - 我不相信有一个等价于{ {1}}用于Java对象监视器。

答案 1 :(得分:1)

我认为您最好使用java.util.concurrent.Semaphore

如果您使用持有一个许可证的信号量:

Semaphore semaphore = new Semaphore(1);

结果代码看起来几乎相同:

if (semaphore.tryAcquire()) {
    try {
        // do work
    } finally {
        semaphore.release();
    }
}
// else skip

我想在.Net中你还必须确保再次释放锁。