0

可能重复:
在 ArrayBlockingQueue 中,为什么要将最终成员字段复制到本地最终变量中?

查看 java.util.concurrent.DelayQueue 的实现,我看到了一个我不太理解的模式。

public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
implements BlockingQueue<E> {

private transient final ReentrantLock lock = new ReentrantLock();
private transient final Condition available = lock.newCondition();
private final PriorityQueue<E> q = new PriorityQueue<E>();

public boolean offer(E e) {
    **final ReentrantLock lock = this.lock;**//(*)
    lock.lock(); 
    try { ... }
    finally {lock.unlock();}

}

public E poll() {
    **final ReentrantLock lock = this.lock**;//(*)
    lock.lock(); 
    try { ... }
    finally {lock.unlock();}
 }}

(*) 行(使用对字段的临时引用)的目的是什么,可以在 BlockingQueue 接口的方法实现中找到,其中涉及一些并发(锁)?考虑一下,如果锁定字段是最终字段,并且在字段初始化期间与其他最终字段一起分配。

4

1 回答 1

1

不在本地复制锁定变量不会对代码的正确性产生任何影响。

这样做可能会带来非常小的性能提升,但我无法理解为什么会这样。除此之外,这可能是作者认为的可读性改进。

于 2012-12-29T14:15:31.650 回答