类加载的装载阶段创造实例,对外只有get方法,线程安全
懒汉式
class SingletonLanHan { private static SingletonLanHan instance; private SingletonLanHan (){} public static SingletonLanHan getInstance() { if (instance == null) { instance = new SingletonLanHan(); } return instance; } }懒加载,第一次调用才实例化,非线程安全,可通过在get方法施加synchronized 锁实现线程安全
双锁式
class SingletonDCL{ private static SingletonDCL instance; private SingletonDCL(){ } public static SingletonDCL getInstance(){ if(instance==null) synchronized(SingletonDCL.class){ if(instance==null) instance=new SingletonDCL(); } return instance; } }判断为空,加锁,在判断为空,实例化 两次空判断,重要性,若不明白就想想,若没有其中一锁,试试 判断后加锁,保证了高性能,锁保证了线程安全
静态内部类式
class SingletonNel{ private static class Singleton{ private static final Singleton INSTANCE=new Singleton(); private Singleton(){} public static final Singleton getInstance(){ return Singleton.INSTANCE; } } }内部类保证了延迟初始化
枚举类式
enum Singleton{ INSTANCE; }就是这么简单,还线程安全,整挺好