1.概念:
确保一个类只有一个实例,并提供全局访问点。
2.实现
2.1 预加载
public class Singleton { private static Singleton singleton = new Singleton(); private Singleton() {} public Singleton getInstance() { return singleton; } }
在类进行初始化的时候创建对象,没有线程安全问题。
2.2 懒加载
虽然有很多种方法,个人比较喜欢静态内部类实现的方法,简单又安全。
public class Singleton2 { private Singleton2() {} private static class SingletonHandler{ private static final Singleton2 INSTANCE = new Singleton2(); } public static Singleton2 getInstance() { return SingletonHandler.INSTANCE; } }
必要情况下枚举也可是实现。
3.测试
测试是否线程安全
public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < 10000; i++) { exec.execute(()->{ System.out.println(Singleton2.getInstance()); }); } exec.shutdown(); }
反复测试,这两个类实现的单例都是线程安全的。