如果我在这个类中使用静态变量作为Java中的锁,类锁是否具有相同的效果?

0 java

例子:

class A {
    public static Integer age;
}

// Approach 1:
class Exe1 {
    public void exec() {
        synchronized(A.class) {
            //do something
        }
    }
}

// Approach 2
public class Exec2 {
    public void exec() {
        synchronized(A.age) {
            //do something
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

方法 2 中的代码与方法 1 的行为方式相同吗?

我的意思是,这两种方法在控制代码执行顺序方面具有相同的效果吗?

Pro*_*man 5

不,不是的。

该块由类的实例synchronize(A.class)控制,该实例始终存在并且始终是相同的实例1。因此,每次执行都由同一实例锁定/同步。Class<A>AExe1.exec()

然而,该synchronize(A.age)块由当前位于静态字段中的当前实例控制A.age。可以通过将不同的实例分配给A.agelike来更改它A.age = Integer.valueOf(42);。之后, 的每次执行都由Exe2.exec()对象控制,独立于当前锁定的其他执行。另外, can be ,这意味着当您遇到. IntegerExe2.exec()A.agenullsynchronize(null) {...}


1 ) JLS 不要求表达式.class(参见15.8.2. 类文字)始终返回相同的实例,参见JLS - 12.2。类和接口的加载

行为良好的类加载器维护这些属性:

  • 给定相同的名称,一个好的类加载器应该始终返回相同的类对象。