我一直在阅读有关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();
}
我不明白这个锁对于该方法的本地意义是什么。 如果我的理解是正确的,那么每次调用此函数都会创建一个新的锁,这会使这个锁多余(如在线程调用中总是通过锁定),并且在方法范围之外的任何地方都不可见。
这种编码模式在整个课程中重复,声明本地最终锁定,锁定然后将其解锁。
编辑:
答案 0 :(得分:2)
final
修饰符仅用于在方法内创建的引用。它仍然指的是在类/对象级别创建的实际锁。所以只是为了澄清,没有为每个方法调用创建新的锁;它使用对象中的现有锁(this
)。
我假设这些类的对象是跨多个线程共享的,因此需要这种模式。
答案 1 :(得分:1)
应该鼓励编译器和JVM在优化过程中做正确的事情。
有关优化工具可以执行的操作的更多讨论,请参阅Instructions reordering in Java JVM。