`

why is static inner class singleton thread safe?

阅读更多

http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom

 

public class Singleton {

    // Private constructor prevents instantiation from other classes
    private Singleton() {
        System.out.println("constructor");
    }

    /**
     * SingletonHolder is loaded on the first execution of
     * Singleton.getInstance() or the first access to SingletonHolder.INSTANCE,
     * not before.
     */
    private static class SingletonHolder {
        public static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }

    public static void main(String[] args) {
        System.out.println("main");
        getInstance();
    }

}

 

When to use it

Use this pattern if the initialization of the class is expensive and it cannot be done safely at class-loading time and the initialization is highly concurrent. The crux of the pattern is the safe removal of the synchronization overhead associated with accessing a singleton instance.

其中有一种使用该模式的情况就是在class-loading阶段如果初始化不安全

Since the class initialization phase is guaranteed by the JLS to be serial, i.e., non-concurrent, no further synchronization is required in the static getInstance method during loading and initialization.
类初始化阶段是连续的,也就是非并发的

 

不过构造时也会引起double-checked locking问题 就是会存在某一个瞬间引用不为空但构造未完成。

 

from: http://topic.csdn.net/u/20110222/13/87f22039-9ef0-48d0-8270-c91516e5cee5.html

分享到:
评论

相关推荐

    singleton_单例模式_java_设计模式_

    1. 饿汉式(Static Inner Class Singleton): 这种方法在类加载时就完成了初始化,所以是线程安全的。它通过将单例类的构造函数设置为私有,并在内部类中创建一个静态的单例对象,保证了只有一个实例存在。例如: ...

    Singleton

    private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } } ``` 7. ...

    java-thread-safe-singleton-pattern.rar_starvation

    private static final Singleton INSTANCE = new Singleton(); } private Singleton() {} public static Singleton getInstance() { return SingletonHolder.INSTANCE; } } ``` 上述代码是典型的双检锁/...

    singleton设计模式java实现及对比

    private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } } ``` 优点:...

    Singleton Pattern 源码

    private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. 懒汉式单例: 这种方式在第一次调用`...

    Singleton 单例模式

    private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. 懒汉式(Lazy Initialization): 类加载时...

    C++完美实现Singleton模式

    static Singleton* Instance() { if (_instance == nullptr) { _instance = new Singleton; } return _instance; } protected: Singleton() {} virtual ~Singleton() {} private: static Singleton* _...

    17-SingleTon.rar

    private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. 饿汉式(静态代码块) 与静态常量类似,但将...

    M2_Singleton_单例模式_java_powder53m_arrow51c_

    private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } } ``` 以上就是...

    singleton单例模式1

    Private static class final Inner{ Private static final Singleton INSTATICE= new Singleton(); } Public static Singleton getInstance(){ Return Inner.INSATICE; } } ``` 这种方式的优点是实例对象的...

    singleton-demo.zip

    private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. **饿汉式(静态代码块)** 类加载时初始化...

    (创建型模式)Singleton模式

    private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. 懒汉式(线程不安全): 这种方式在类加载时并不...

    java Singleton单例模式

    private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 这种实现方式在类加载时就完成了实例化,线程安全...

    单例模式Singleton

    private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. **懒汉式**: 懒汉式是在首次调用`getInstance...

    设计模式 之 “单例模式[Singleton Pattern]”

    4. **静态内部类(Static Inner Class)**:利用类加载机制保证初始化实例时只有一个线程,避免了同步锁,同时也延迟了初始化。 ```java public class Singleton { private Singleton() {} private static class ...

    Singleton单例模式.zip

    private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton(), isThreadSafe: true); private Singleton() {} public static Singleton Instance => lazy.Value; } ``` 6...

    Java面试-代码与编程题.doc

    private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } } ``` 这种实现...

    单例模式(Singleton)的6种实现

    private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } } ``` 类加载...

    单例模式(singleton)

    private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. 懒汉式(Lazy Initialization):在第一次调用...

    singleton.zip

    private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. 线程安全的同步方法: 在多线程环境中,为了...

Global site tag (gtag.js) - Google Analytics