1

我有一个关于单例模式的问题。在单例模式中,我们写

synchronized(ClassName.class){

     // other code goes here

}

写作的目的是ClassName.class什么?

4

3 回答 3

4

在成员方法(非静态)中,您有两种选择使用哪个监视器(锁):“ 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() {
   ...
}
于 2014-11-15T14:48:35.900 回答
1

每个类(例如Foo)都有一个对应的唯一实例java.lang.Class<Foo>Foo.class是一个类型的文字,Class<Foo>它允许获取对这个唯一实例的引用。并使用

synchronized(Foo.class) 

允许在此对象上同步。

于 2014-11-15T14:22:58.003 回答
0

传入同步块的对象称为监视器。由于代表该类的对象className.class保证在 JVM 中只存在一次,这意味着只有一个线程可以进入该同步块。

它在单例模式中使用以确保 JVM 中存在单个实例。

于 2014-11-15T14:23:30.473 回答