使用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. windows-7 - win7下使用cmder,如何设置vim的tab为4个空格?2. MySQL的SELECT...FOR UPDATE究竟起什么作用3. python - 怎么进行服务器性能分析4. python 多进程 或者 多线程下如何高效的同步数据?5. thinkPHP5中获取数据库数据后默认选中下拉框的值,传递到后台消失不见。有图有代码,希望有人帮忙6. mysql - 要取出数据库中按某字段排序后的前10,20,30条数据要怎么做?7. web - nginx location 搜索算法问题!?8. javascript - nodejs使用mongoose连接数据库,使用post提交表单在后台,后台处理后调用res.redirect()跳转界面无效?9. javascript - 关于js高级程序中的问题10. java - socket类服务端如何防止被ddos攻击?

网公网安备