美文网首页
线程安全的singleton,双检锁

线程安全的singleton,双检锁

作者: IAmWhoAmI | 来源:发表于2018-05-02 20:54 被阅读39次

少了一个枚举的方式。利用枚举类型来创建Singleton。
下面的文章案例很清晰,看文章。
https://blog.csdn.net/a347911/article/details/53321803

有个专业的说法,叫双检锁

http://www.importnew.com/12196.html
这个文章中,重要的一点:

public static Singleton getInstanceDC() {
    if (_instance == null) {                // Single Checked
        synchronized (Singleton.class) {
            if (_instance == null) {        // Double checked
                _instance = new Singleton();
            }
        }
    }
    return _instance;
}


这个方法表面上看起来很完美,你只需要付出一次同步块的开销,但它依然有问题。除非你声明`_instance`变量时使用了[volatile](http://javarevisited.blogspot.sg/2011/06/volatile-keyword-java-example-tutorial.html)关键字。没有`volatile`修饰符,可能出现Java中的另一个线程看到个初始化了一半的`_instance`的情况,但使用了`volatile`变量后,就能保证先行发生关系(happens-before relationship)。对于`volatile`变量`_instance`,所有的写(write)都将先行发生于读(read),在Java 5之前不是这样,所以在这之前使用双重检查锁有问题。现在,有了先行发生的保障(happens-before guarantee),你可以安全地假设其会工作良好。另外,这不是创建线程安全的单例模式的最好方法,你可以使用[枚举实现单例模式](http://javarevisited.blogspot.com/2012/07/why-enum-singleton-are-better-in-java.html),这种方法在实例创建时提供了内置的线程安全。另一种方法是使用静态持有者模式(static holder pattern)

相关文章

网友评论

      本文标题:线程安全的singleton,双检锁

      本文链接:https://www.haomeiwen.com/subject/lbqhrftx.html