0

在阅读 ArrayBlockingQueue 的源代码时,我发现以下代码:

public E take() throws InterruptedException {
    final ReentrantLock lock = this.lock;
    lock.lockInterruptibly();
    try {
        try {
            while (count == 0)
                notEmpty.await();
        } catch (InterruptedException ie) {
            notEmpty.signal(); // propagate to non-interrupted thread
            throw ie;
        }
        E x = extract();
        return x;
    } finally {
        lock.unlock();
    }
}

为什么不使用代码

public E take() throws InterruptedException {
     lock.lockInterruptibly();
    try {
        try {
            while (count == 0)
                notEmpty.await();
        } catch (InterruptedException ie) {
            notEmpty.signal(); // propagate to non-interrupted thread
            throw ie;
        }
        E x = extract();
        return x;
    } finally {
        lock.unlock();
    }
}

行代码的好处是什么:final ReentrantLock lock = this.lock;

4

1 回答 1

0

这个想法是由 Doug Lea 推广的——我认为最初的想法是当使用最终的局部变量时,JVM 可能会执行一些与性能相关的优化。

从讨论这个问题的 OpenJDK 线程中查看这个线程

编辑:

一些研究在堆栈上抛出了这两个相关的问题:

在 ArrayBlockingQueue 中,为什么要将 final 成员字段复制到本地 final 变量中?

使用前Java Lock 变量赋值。为什么?

于 2013-04-13T13:35:45.047 回答