静态方法中同步静态方法和同步块之间的区别?

时间:2015-12-03 23:10:23

标签: java multithreading singleton

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

同步静态方法:

    public static synchronized Singleton getInstance() {
        if(instance==null){
            instance = new Singleton();
        }
        return instance;
    }
静态方法中的

和同步块:

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

为什么我们必须在第二种方法中检查instance==null两次,第二种方法优于第一种方法的优势是什么?

1 个答案:

答案 0 :(得分:1)

在第二个例子中,由于竞争条件,你必须检查instance==null两次 - 如果两个线程同时检查这个条件,那么它们都会进一步使用if语句。然后,只有一个人可以进入关键部分,但如果没有null再次检查thread2会覆盖instance

的值

区别在于第一个是coarse grained同步,第二个是fine grained

  • 在第一个例子中,每次调用函数时都会获得锁定(它的速度较慢)
  • 在第二个中你可能只在第一个函数调用时获得锁定(由于每次都没有锁定,速度要快得多)