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

在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.lockfinal?

此外,它还使用E[]在采取行动之前:

private E extract() {
    final E[] items = this.items;
    E x = items[takeIndex];
    items[takeIndex] = null;
    takeIndex = inc(takeIndex);
    --count;
    notFull.signal();
    return x;}

是否有任何理由将最终字段复制到局部变量中?


慕妹3146593
浏览 482回答 2
2回答

qq_遁去的一_1

这是一个极端优化,DougLea,这个类的作者,喜欢使用。这里有个帖子最近的线索在核心的libs-dev邮件列表中,这个精确的主题很好地回答了你的问题。从岗位:.复制到本地会生成最小的字节码,对于低级代码来说,编写离机器稍微近一点的代码是很好的

白猪掌柜的

这条线给出一些答案。实质内容:编译器很难证明最终字段在方法中不会改变(因为反射/序列化等)。大多数当前编译器实际上不尝试,因此每次使用时都必须重新加载最终字段,这可能会导致缓存丢失或页面错误。将其存储在局部变量中会迫使jvm只执行一个负载。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java