为了账号安全,请及时绑定邮箱和手机立即绑定

在ArrayBlockingQueue中,为什么要将最终成员字段复制到局部变量中?

在ArrayBlockingQueue中,为什么要将最终成员字段复制到局部变量中?

慕妹3146593 2019-06-26 16:55:13
在ArrayBlockingQueue中,为什么要将最终成员字段复制到局部变量中?在……里面ArrayBlockingQueue,所有需要锁的方法都将其复制到本地。final变量,然后调用lock().public boolean offer(E e) {     if (e == null) throw new NullPointerException();     final ReentrantLock lock = this.lock;     lock.lock();     try {         if (count == items.length)             return false;         else {             insert(e);             return true;         }     } finally {         lock.unlock();     }}有什么理由复制this.lock到局部变量lock当田野this.lock是final?此外,它还使用E[]在采取行动之前:private E extract() {     final E[] items = this.items;     E x = items[takeIndex];     items[takeIndex] = null;     takeIndex = inc(takeIndex);     --count;     notFull.signal();     return x;}是否有任何理由将最终字段复制到局部变量中?
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

这是一个极端优化,DougLea,这个类的作者,喜欢使用。这里有个帖子最近的线索在核心的libs-dev邮件列表中,这个精确的主题很好地回答了你的问题。

从岗位:

.复制到本地会生成最小的字节码,对于低级代码来说,编写离机器稍微近一点的代码是很好的


查看完整回答
反对 回复 2019-06-26
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

这条线给出一些答案。实质内容:

  • 编译器很难证明最终字段在方法中不会改变(因为反射/序列化等)。
  • 大多数当前编译器实际上不尝试,因此每次使用时都必须重新加载最终字段,这可能会导致缓存丢失或页面错误。
  • 将其存储在局部变量中会迫使jvm只执行一个负载。


查看完整回答
反对 回复 2019-06-26
  • 2 回答
  • 0 关注
  • 481 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号