直接介绍几种线程安全的且我觉得还比较不错的方式:
1、饿汉式,就是类加载就初始化了:
public class Singleton { private static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; } }
2、懒汉式,到你需要时,才会去创建:
public class Singleton { private static Singleton instance ; private Singleton(){} public static Singleton getInstance(){ if (instance == null){ synchronized (Singleton.class){ if (instance == null){ instance = new Singleton(); } } } return instance; } }
3、使用Java的枚举,如果对枚举不熟悉,小Google一下:
public enum Singleton { instance; }
4、使用一个持有类,主要是为了不在初始化的时候加载:
public class Singleton { private Singleton(){}; private static final class InstanceHolder{ private static Singleton INSTANCE = new Singleton(); } public static Singleton getInstance(){ return InstanceHolder.INSTANCE; } }
好了,就这么多,以上四种都是比较推荐使用的,除了第一种会类加载的时候初始化,其它三种都不会,且种都保证线程安全,特殊情况(除了多个类加载器,和你非要通过反射等手段生成多个对象)不考虑