我们为什么要编写Synchronized(ClassName.class)

时间:2014-11-15 14:14:28

标签: java design-patterns thread-safety synchronized-block

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

synchronized(ClassName.class){

     // other code goes here

}

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

3 个答案:

答案 0 :(得分:1)

每个类(例如Foo)都有一个对应的唯一java.lang.Class<Foo>实例。 Foo.classClass<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中存在单个实例。