【问题标题】:Why is lock captured to a local variable为什么锁定被捕获到局部变量
【发布时间】:2012-04-28 04:02:33
【问题描述】:

在java JRE中我看到the code

private final ReentrantLock lock;
public E poll() {
        final ReentrantLock lock = this.lock;
        lock.lock();

为什么锁被捕获到私有变量?我希望只是

public E poll() {
        lock.lock();

【问题讨论】:

标签: java reentrantlock


【解决方案1】:

主要是为了确保最佳性能。虽然这是一个真正的微优化,但它可能是在对性能敏感的代码中,你不妨去做。

您还需要非常小心您使用的锁引用不会发生变化。确定字段为final,但采用final 本地引用是本地显式的。

【讨论】:

  • 优化了什么?访问 final 类成员是否比本地 final 成员慢?
  • @EugeneRetunsky 如果您查看重复的帖子及其引用的内容:“复制到本地人会产生最小的字节码”
  • 是的,但这确实是微观的。从性能的角度来看,你不会注意到 - 即使在纳秒级别,我相信。特别是与锁定/解锁相比。此外,它只保存了对该字段的一次访问,并且使代码不那么清晰,导致性能不明显。
  • 嗯,这并不是那么简单——它可以为您节省整个缓存未命中,甚至是页面错误。这样做的理由多于不这样做的理由。
  • 我相信性能是经过衡量的。道格就是这样。字节码大小也会影响 HotSpot 是否内联。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多