首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java锁结构最佳模式

Java锁结构最佳模式
EN

Stack Overflow用户
提问于 2015-06-25 19:02:28
回答 2查看 2.3K关注 0票数 9

从技术角度看,这两个清单有什么不同?首先是在锁定的java中提供的。第二是我的。

1.

代码语言:javascript
复制
 Lock l = ...;
         l.lock();
         try {
             // access the resource protected by this lock
         } finally {
             l.unlock();
         }

2.

代码语言:javascript
复制
Lock l = ...;

     try {
         l.lock();
         // access the resource protected by this lock
     } finally {
         l.unlock();
     }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-25 19:07:44

原因是在Lock中找到

执行方面的考虑 锁实现通常会对线程释放锁(通常只有锁的持有人才能释放锁)施加限制,并在违反限制时抛出(未检查的)异常。任何限制和异常类型都必须由Lock实现记录。

类似地,如果出现未经检查的异常,.lock()可能会失败。

这意味着:

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

如果锁定失败,您将永远无法到达unlock()。鉴于:

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

如果锁定失败,则不必要地抛出两个异常;其中一个将丢失。

更不用说,取决于锁的实现,使用第二个版本,您可能最终会解锁“其他人”的锁……这不是件好事。

票数 14
EN

Stack Overflow用户

发布于 2015-06-25 19:06:17

区别在于如果l为null会发生什么:

  • 第一个示例将失败,异常指向第一行,位于try块之上。
  • 第二个示例将失败,因为NPE会被从finally块抛出的另一个NPE屏蔽。

此外,如果锁定失败,则第二个示例中的first块可能尝试解锁未锁定的锁,而第一个示例则不会。

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

https://stackoverflow.com/questions/31058681

复制
相关文章

相似问题

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