java.util.concurrent.BlockingQueue的实现

时间:2012-12-29 14:09:30

标签: java concurrency blockingqueue

  

可能重复:
  In ArrayBlockingQueue, why copy final member field into local final variable?

查看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接口的方法实现中找到,其中涉及一些并发(锁)?考虑一下,在锁定字段是最终的情况下,并在使用其他最终字段进行字段初始化时分配。

1 个答案:

答案 0 :(得分:1)

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

通过这样做可能会有非常小的性能提升,但我无法理解为什么会这样。除此之外,作者可能会考虑提高可读性。