同步块中的反射 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 本身相关的标志。您仍然可以在非静态方法中使用这两种类型的标志。
我有单例实现
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 本身相关的标志。您仍然可以在非静态方法中使用这两种类型的标志。