在中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;
}
有什么理由将最终字段复制到本地最终变量?
该类的作者Doug Lea喜欢使用这种极端的优化方法。这是有关core-libs-dev邮件列表的最新主题的帖子,有关这个确切的主题,可以很好地回答您的问题。
从帖子中:
…复制到本地会产生最小的字节码,对于低级代码,最好编写离机器更近的代码
问题内容: 这个问题已经在这里有了答案 : 为什么在匿名类中只能访问最终变量? (15个答案) 为什么实例变量“忽略Lambda表达式中使用的变量必须是最终变量或实际上是最终变量”警告[重复] (2个答案) Lambdas:局部变量不需要最终变量,实例变量不需要 (10个答案) 2年前关闭。 当我编写此代码时,我收到一个编译时错误,该错误是: “ lambda中的变量必须是final或有效的fin
在Java8中,Java设计者提出了一个有效的final变量的概念,即一个如果被“final”追加就不会给编译器带来错误的变量。我的问题是,这个新提出的“有效最终”概念比经典的“最终”提供了什么?作为一名Java开发人员,我实际上得到了什么好处?
问题内容: 我读了这个问题不可变对象,并留下了关于不可变对象,并最终场一个问题: 为什么我们需要不可变类中的实例变量为最终变量? 例如,考虑以下不可变的类: 如果在上面的代码中没有set方法,而实例变量仅在构造函数中设置,为什么要求将实例变量声明为final? 问题答案: 有没有 要求 这样做的变量。但是,当您确实明确打算永远不更改变量时,通常这样做是一种好习惯,因为这不仅可以使变量避免错别字或其
定义不可变类的策略表明 所有字段都应该是最终字段。 对于ex: 为什么一定要最终决定? 因为我没有给出setter方法吗?它不能改变。谢谢。
我读到了这个关于不可变对象的问题,留下了一个关于不可变对象和final字段的问题: 为什么我们需要不可变类中的实例变量成为最终变量? 例如,考虑这个不可变类: 如果在上面的代码中没有设置方法,并且实例变量只在构造函数中设置,那么为什么需要将实例变量声明为final?
问题内容: 在SO和google中寻找了这个问题的答案,但找不到任何答案。 我有以下代码: 编译器返回以下内容: 从内部类内部访问局部变量变量;需要宣布为最终 为什么必须最终决定的技术原因是什么? 问题答案: 这是因为您正在使用匿名内部类。发生的是编译器为您创建了类。它将其称为您的外部类,并添加和编号,例如,等等。 该类具有对自动初始化的外部类的引用,因此其实例可以使用外部类的方法和字段。 但是您