使用synchronized(lock object)块时,静态锁对象是否需要是final的?

Ton*_*oni 2 java synchronization synchronized

假设我有一个

private static Object lock = new Object();
Run Code Online (Sandbox Code Playgroud)

在同一个班级的某个地方

public void run() {
synchronized(lock) {
    //only 1 thread here, all others wait
  }
}
Run Code Online (Sandbox Code Playgroud)

我总是读到锁对象应该是最终的,但不知道为什么。假设我 100% 知道我的代码不会在任何地方触及锁定对象,如果省略了final关键字,这是否意味着同步不是100%防弹的

Dav*_*INO 5

在这种情况下使用final只是一个好的做法。

您可以使用任何对象进行同步,final或者非最终对象,static或者非静态对象。

一起使用final将给static您带来安全性,没有人会在不同的锁上同步相同的代码。如果不使用,final您不确定代码中的某个位置是否未重新分配该变量。

一般来说,使用final初始化后不再重新分配的变量是一种很好的编程实践。它提高了可读性,因为阅读代码的人知道,在不阅读完整代码的情况下,该变量永远不会被重新分配。