使用Java Lock变量之前要进行赋值。为什么?
当您在方法中分配给局部变量时,编译器可以进行一些优化。请参见在ArrayBlockingQueue中,为什么将最终成员字段复制到本地最终变量中?
解决方法在许多Java源代码中(例如LinkedBlockingDeque),我看到了类似的东西;
final ReentrantLock lock = new ReentrantLock();public void putLast(E e) throws InterruptedException { final ReentrantLock lock = this.lock; lock.lock(); try { // do stuff } finally {lock.unlock(); }}
我了解基本模式(锁定,最终解锁),但是我的问题是, 为什么在使用它之前先对本地作用域的Lock变量进行赋值? 为什么这样做而不是以下内容?
final ReentrantLock lock = new ReentrantLock();public void putLast(E e) throws InterruptedException { this.lock.lock(); try { // do stuff } finally {lock.unlock(); }}
它会影响优化吗?第一个示例可以防止锁变粗吗?
评论后编辑 :如果您真的不知道为什么会出现这种情况,请不要添加答案。这是从Java来源获得的,@author标记是DougLea,所以我很确定它的存在是有原因的。请不要指出该代码是完全等效的。
谢谢
相关文章:
1. python - 求一个在def中可以实现调用本def满足特定条件continue效果的方法(标题说不太清楚,请见题内描述)2. $fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题3. 数据库设计 - MySQL数据库主键问题4. MySQL能否给某个字段的值设置有效期?5. mysql数据库做关联一般用id还是用户名6. mysql 5.7单表300万数据,性能严重下降,如何破?7. MySQL 这句 创建表结构语句的错误在哪?8. node.js - 我想让最后进入数据库的数据,在前台最先展示,如何做到?9. mysql - 我的myeclipse一直连显示数据库连接失败,不知道为什么10. MYSQL新建用户设置可以远程访问的问题
![$fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题](http://www.haobala.com/attached/image/news/202205/093622cb60.png)