饿汉式

忽略

懒汉式

说它是懒汉式,因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance

public class Singleton {
	
	/**
	 * 静态内部类保证线程同步
	 * @author panqian
	 *
	 */
	private static class SingletonHolder{
		private static Singleton singleton = new Singleton();
	}

	private Singleton() {
	}

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

双重检查

也属于懒汉式

public class Singleton {

    private static volatile Singleton obj;

    private Singleton() {
    }


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


}

CAS方式

懒汉式,饿汉式,其实现原理都是利用借助了类加载的时候初始化单例。即借助了ClassLoader的线程安全机制。

所谓ClassLoader的线程安全机制,就是ClassLoader的loadClass方法在加载类的时候使用了synchronized关键字。也正是因为这样, 除非被重写,这个方法默认在整个装载过程中都是同步的,也就是保证了线程安全。

所以,以上各种方法,虽然并没有显示的使用synchronized,但是还是其底层实现原理还是用到了synchronized。

public class Singleton {

    private static volatile AtomicReference<Singleton> atomicReference = new AtomicReference();

    private Singleton() {
    }

    public static Singleton getInstance() {
        while (true) {
            Singleton singleton = atomicReference.get();
            if (null == singleton) {
                //如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
                atomicReference.compareAndSet(null, new Singleton());
                continue;
            }
            return singleton;
        }
    }

}