首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在尝试之前使用lock.lock()

在尝试之前使用lock.lock()
EN

Stack Overflow用户
提问于 2012-06-03 14:40:08
回答 4查看 5.6K关注 0票数 21

以下内容有什么不同:

代码语言:javascript
复制
private Lock lock = new ReentrantLock(true);

public void getIn (int direction) throws InterruptedException {

     lock.lock();
     try {
         ...

代码语言:javascript
复制
...

public void getIn (int direction) throws InterruptedException {

      try {
          lock.lock();
          ...

编译过程很顺利,程序也能正常工作(我指的是相同的输出)

我应该把lock.lock();放在尝试之前还是之后?

谢谢你的帮助

EN

回答 4

Stack Overflow用户

发布于 2012-06-03 14:53:22

假设lock是一个ReentrantLock,那么它没有什么实际的区别,因为lock()不会抛出任何检查过的异常。

然而,Java文档在ReentrantLock示例中的try块之外留下了lock()。这样做的原因是,lock()中未检查的异常不应导致错误地调用unlock()。在lock()中存在未检查的异常的情况下,正确性是否值得关注,这完全是另一种讨论。

一般来说,尽可能保持try块的细粒度是一个很好的编码实践。

票数 23
EN

Stack Overflow用户

发布于 2012-06-03 15:05:26

如果是第一种情况,在finally中你可以直接说unlock()。如果是No2,你需要在unlock()之前检查你是否持有锁,否则你会得到IllegalMonitorStateException

票数 10
EN

Stack Overflow用户

发布于 2012-06-03 14:56:29

try语句还包含:

代码语言:javascript
复制
 } finally {
     lock.unlock();
 }

也就是说,如果您将lock.lock()放在try之后,lock.lock()抛出的异常将导致lock.unlock(),这是错误的,因为没有获得锁,解锁将导致另一个异常。所以第一个变种是正确的。要处理lock.lock()抛出的异常,必须使用另一个try语句。

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

https://stackoverflow.com/questions/10868423

复制
相关文章

相似问题

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