java - 同步静态方法和静态方法内的同步块(synchronized block)之间的区别?

标签 java multithreading singleton

在实现单例模式时,有人可以解释一下以下之间的区别:

同步静态方法:

    public static synchronized Singleton getInstance() {
        if(instance==null){
            instance = new Singleton();
        }
        return instance;
    }

以及静态方法内的同步块(synchronized block):

    public static Singleton getInstance() {
        if(instance==null){
            synchronized(Singleton.class){
                if(instance==null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

为什么我们必须检查instance==null第二种方法两次,第二种方法比第一种方法有什么优点?

最佳答案

在第二个示例中,您必须检查 instance==null由于竞争条件两次 - 如果两个线程同时检查此条件,那么它们都会进一步使用 if陈述。那么只有一个可以进入临界区,但没有null再次检查thread2将覆盖 instance 的值

不同的是第一个是coarse grained同步,第二个是 fine grained :

  • 在第一个示例中,每次调用函数时都会获得锁(速度较慢)
  • 在第二个中,您可能只会在第一个函数调用时获得锁定(由于不是每次都锁定,所以速度要快得多)

关于java - 同步静态方法和静态方法内的同步块(synchronized block)之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34078013/

相关文章:

PHP Static v Singleton 类 - ConnectionFactory 解释

c++ - 单例日志类中运算符 << 的问题

java - 用于添加全局存储的 Kafka 流用例

java - 为什么我在谷歌地图 "Failed to load DynamiteLoader: java.lang.ClassNotFoundException: Didn' 上找不到类时出现此错误?

java - 如何同步两个异步任务?

c - 如何让线程2,3和4等待来自线程1的相同信号?

android - Binder : Caught a RuntimeException from the binder stub implementation after integrating firebase

java - 通过比较两个参数打印连续的数字

java - 为什么 InstantiationException 是检查异常?

C++ 线程函数说明