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

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

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

synchronized(ClassName.class){

     // other code goes here

}

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

最佳答案

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

如果您的目的是协调对象实例上的锁定,请使用“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() {
   ...
}

关于java - 为什么我们要写Synchronized(ClassName.class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26946728/

相关文章:

java - Java 中并发的 gremlin-server 和图形查询

java - Java中的真正随机生成

c# - 原型(prototype)设计模式

java - 工厂方法的正确实现

java - 循环同步死锁

java - Eclipse RCP - 以编程方式更新菜单项

java - 如何验证服务器是否支持 TLS 1.0 协议(protocol)?

python - Python/Redis 中的任务委托(delegate)

即使调用cancel方法后,Java线程也不会停止?

java - 以线程安全的方式从数组列表返回对象?