Java 在使用前锁定变量赋值。为什么?

标签 java multithreading concurrency thread-safety

在很多 Java 源代码中,(例如 LinkedBlockingDeque)我看到这样的事情;

final ReentrantLock lock = new ReentrantLock();

public void putLast(E e) throws InterruptedException {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
       // do stuff
    } finally {
        lock.unlock();
    }
}

我了解基本模式(最后锁定,解锁),但我的问题是为什么要在使用之前对局部作用域的 Lock 变量进行赋值?为什么这样做而不是以下? p>

final ReentrantLock lock = new ReentrantLock();

public void putLast(E e) throws InterruptedException {
    this.lock.lock();
    try {
       // do stuff
    } finally {
        lock.unlock();
    }
}

它会影响优化吗?第一个示例可以防止锁粗化吗?

评论后编辑:如果您真的不知道为什么会这样,请不要添加答案。这是来自 Java 源代码,@author 标签是 Doug Lea,所以我很确定它在那里是有原因的。请不要指出代码只是等价的。

谢谢

最佳答案

当你在方法中赋值给局部变量时,编译器可以做一些优化。 见In ArrayBlockingQueue, why copy final member field into local final variable?

关于Java 在使用前锁定变量赋值。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56133375/

相关文章:

java - 如何在 java "Share Simple code for beginners"中同时打印文本和图像

java - excel poi : apply foreground color to blank cells

python - 当一个线程正在运行时阻塞其他线程

concurrency - 您如何在 ColdFusion 应用程序中使用 CFThread?

multithreading - Erlang在运行并发任务时没有使用所有CPU核心,为什么?

java - log4j 如何将当前 log4j 配置转储为属性文件格式?

java - 如何在 Spring Boot 中为 Freemarker 指定多个 templateLoaderPath?

Java 线程 - 阻塞状态

c# - C#中如何读取字节

c++ - 如何在 MinGW 中启用实验性 C++11 并发功能?