同步块中的反射 class

Reflection class in synchronized block

我有单例实现

public class Singleton {

private static volatile Singleton inst;

public static Singleton instOf() {
    if (inst == null) {
        synchronized (Singleton .class) {
            if (inst == null) {
                inst = new Singleton ();
            }
        }
    }
    return inst;
}

我不太明白“同步 (Singleton.class)”是什么意思? 如果只是同步 (this) 而不是

JVM 有一个监视器或称为 intristic 标志,与 class 元信息相关,元信息存储在内存中的某个特定位置(permGen 或元空间)。在那个地方,存在一个监视器标志,并且与它自身的 class 相关,而不是 class.

的某个实例

synchronized (Singleton.class) 将在 permgen 内存(jdk 8 之前)或元空间内存(jdk 8 及之后)中捕获此标志。

JVM 还为存储在堆中的每个 class 实例提供了一个单独的监视器标志。

synchronized (this) 将捕获堆内存中特定实例的标志,该标志在调用该实例时由 this 指向。

这些标志的工作方式相同,但只是不同的标志。因此只有 1 个线程可以要求捕获标志,其他线程应该等待释放该标志,然后才能捕获它并访问代码。如果您锁定静态标志或实例标志,这取决于您和您的要求,但概念是相同的。没有 2 个线程可以同时持有相同的标志。 1会阻塞等待flag释放后才能访问synchronized代码

注意:this 在静态方法中不起作用。在这种情况下,您只能使用与 class 本身相关的标志。您仍然可以在非静态方法中使用这两种类型的标志。