第一种:懒汉模式
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。
第二种:饿汉模式
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。
第三种:静态内部类方式
/** * qccr.com Inc. * Copyright (c) 2014-2016 All Rights Reserved. */ package com.qccr.ikeeper.web.rcache; /** * @author chenghuanhuan@qccr.com * @since $Revision:1.0.0, $Date: 2017年03月05日 下午9:20 $ */ public class Singleton { private static class SingletonHolder{ private static Singleton singleton = new Singleton(); } private Singleton(){}; public static Singleton getInstance(){ return SingletonHolder.singleton; } }
第四种:枚举
public enum Singleton { INSTANCE; public void whateverMethod() { } }
第五种:双重校验锁
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }