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