为什么我们写同步(ClassName.class)(Why do we write Synchron

2019-10-21 07:11发布

我在单例模式的问题。 在单例模式我们写

synchronized(ClassName.class){

     // other code goes here

}

什么是写作的目的ClassName.class

Answer 1:

在一个成员方法(非静态),你有监视器(锁)的两种选择使用:“this”和“ 我的类的单一静态锁 ”。

如果你的目的是要创建的对象的坐标的锁,用“ 这个 ”:

...
synchronized (this) {
  // do critical code
}

要么

public synchronized void doSomething() {
 ...
}

但是,如果你想有安全操作,包括两种:

  • 静态方法

  • 你的类的静态成员

然后,关键是要抓住一个类范围的锁。 有2种方式对静态锁同步:

...
synchornized(ClassName.class) {
   // do class wide critical code
}

要么

public static synchronized void doSomeStaticThing() {
   ...
}

非常重要的是 ,以下2种方法,不要用同一个锁的坐标:

public synchronized void doMemberSomething() {
   ...
}

public static synchronized void doStaticSomething() {
   ...
}


Answer 2:

每个类(例如Foo )具有一个相应的,唯一的实例java.lang.Class<Foo>Foo.class是一个文本类型的Class<Foo>其允许获得这种独特的实例的引用。 并使用

synchronized(Foo.class) 

允许此对象上同步。



Answer 3:

您传递到同步块中的对象被称为监视器。 由于它表示该对象的类别className.class是保证只在JVM中存在,一旦它意味着只有一个线程可以进入该同步块。

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



文章来源: Why do we write Synchronized(ClassName.class)