各位高手,jdk源码中的这段代码为什么这么写?

settings
  • 482
ArrayBlockingQueue
    public E take() throws InterruptedException {
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            while (count == 0)
                notEmpty.await();
            return dequeue();
        } finally {
            lock.unlock();
        }
    }

为什么要方法内先通过声明final类型的变量来获取对this.lock的引用?直接用不可以吗?

回复
阅读 286
3 个回答

赋值给局部变量,接下来就不需要考虑这个变量的并发修改问题了。成员变量存在并发中,没有办法保证它的状态不会在其他线程中被修改。

底层代码,把成员变量赋值给局部变量以提高(一丢丢)性能
其他地方也很常见这种写法,毕竟是底层,抠性能还是很值得的

苏幕遮云
  • 1
新手上路,请多包涵

1.成员变量再次赋值给局部变量,指定JVM去使用赋值后的局部变量,无需理会成员变量,此时JVM就可以将该变量放在CPU缓存中,每次从CPU缓存中读取变量的值,不用去内存中重新加载,提高了运行速度。

2.这是一种激进的优化策略,通过增加字节码来换取速度,相当于用空间换时间。而且作用其实并不大,除非某个方法频繁被执行、并且业务需求极其追求速度,否则并不建议在日常编程中这样写

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏