单例模式的实现
实现过程中需要考虑线程安全
1. 使用同步
public class Singleton{ private static Singleton instance = null; private Singleton(){} public Singleton getInstance(){ if(instance == null){ initInstance(); } return instance; } private static synchronized void initInstance(){ if(instance == null){ instance = new Singleton(); } } }
2. 使用静态内部类
public class Singleton{ private Singleton(){} private static class SingletonIns{ private static Singleton instance = new Singleton(); } public Singleton getInstance(){ return SingletonIns.instance; } }
实现懒加载:虚拟机加载机制介绍了触发类初始化的时机,其中一项是读取或设置一个类型的静态字段时触发该类加载,即 getInstance() 方法中的 return SingletonIns.instance ,调用这个方法才会触发类加载。
实现单例:JVM保证类的<clinit>()方法在多线程下会被正确的加锁,而初始化方法,就是对静态变量的赋值和静态语句块中的语句,这里就是 instance = new Singleton() 这个操作。
3. 使用枚举类
public class Singleton{} public enum SingletonEnum{ INSTANCE; private Singleton instance; private SingletonEnum() { instance = new Singleton(); } public Singleton getInstance() { return instance; } }
人生就像蒲公英,看似自由,其实身不由己。