为什么有人会制作本地最终的Lock in方法?

时间:2015-12-08 10:42:50

标签: java multithreading concurrency java.util.concurrent concurrent-programming

我一直在阅读有关Executors服务的Java源代码。在检查ThreadPoolExecutor类时,我发现这个代码是关闭的:

public void shutdown() {
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        checkShutdownAccess();
        advanceRunState(SHUTDOWN);
        interruptIdleWorkers();
        onShutdown(); // hook for ScheduledThreadPoolExecutor
    } finally {
        mainLock.unlock();
    }
    tryTerminate();
}

我不明白这个锁对于该方法的本地意义是什么。 如果我的理解是正确的,那么每次调用此函数都会创建一个新的锁,这会使这个锁多余(如在线程调用中总是通过锁定),并且在方法范围之外的任何地方都不可见。

这种编码模式在整个课程中重复,声明本地最终锁定,锁定然后将其解锁。

编辑:

  • 固定代码误读废话

2 个答案:

答案 0 :(得分:2)

final修饰符仅用于在方法内创建的引用。它仍然指的是在类/对象级别创建的实际锁。所以只是为了澄清,没有为每个方法调用创建新的锁;它使用对象中的现有锁(this)。

我假设这些类的对象是跨多个线程共享的,因此需要这种模式。

答案 1 :(得分:1)

应该鼓励编译器和JVM在优化过程中做正确的事情。

有关优化工具可以执行的操作的更多讨论,请参阅Instructions reordering in Java JVM