我有一个关于单例模式的问题。在单例模式中,我们写
synchronized(ClassName.class){
// other code goes here
}
写作的目的是ClassName.class
什么?
我有一个关于单例模式的问题。在单例模式中,我们写
synchronized(ClassName.class){
// other code goes here
}
写作的目的是ClassName.class
什么?
在成员方法(非静态)中,您有两种选择使用哪个监视器(锁):“ this ”和“ my class's single static lock ”。
如果您的目的是协调对象实例上的锁定,请使用“ this ”:
...
synchronized (this) {
// do critical code
}
或者
public synchronized void doSomething() {
...
}
但是,如果您尝试进行安全操作,包括:
静态方法
你班级的静态成员
那么获取一个类范围的锁是至关重要的。有两种方法可以在静态锁上同步:
...
synchornized(ClassName.class) {
// do class wide critical code
}
或者
public static synchronized void doSomeStaticThing() {
...
}
非常重要的是,以下 2 种方法不会在同一个锁上协调:
public synchronized void doMemberSomething() {
...
}
和
public static synchronized void doStaticSomething() {
...
}
每个类(例如Foo
)都有一个对应的唯一实例java.lang.Class<Foo>
。Foo.class
是一个类型的文字,Class<Foo>
它允许获取对这个唯一实例的引用。并使用
synchronized(Foo.class)
允许在此对象上同步。
传入同步块的对象称为监视器。由于代表该类的对象className.class
保证在 JVM 中只存在一次,这意味着只有一个线程可以进入该同步块。
它在单例模式中使用以确保 JVM 中存在单个实例。