确保类只有一个实例,并提供一个全局的访问点。
创建步骤
- 构造函数私有化
- 类持有一个静态实例instance
- 提供一个静态方法访问单例
一个私有的构造函数、一个静态变量、一个静态方法
创建方法
-
同步创建
优点: 简单
缺点: getInstance()方法只有在第一次创建的时候才需要同步,在实例化后就不需要同步了,会降低程序性能
public class Singleton{ private static Singleton instance; private Singleton{} public static synchronized Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } }
-
急切实例化
优点: 简单
缺点: JVM在加载类时创建出实例,造成运行负担。
public class Singleton{ private static Singleton instance = new Singleton(); private Singleton{} public static Singleton getInstance(){ return instance; } }
-
双重检查加锁
优点: 延迟实例化,减少负担,同时减少同步时间
缺点: volatile对于java 1.4版本不支持
public class Singleton{ private volatile static Singleton instance; // volatile 保证内存可见 private Singleton{} public static Singleton getInstance(){ if(instance == null){ // 检查一次 synchronized(Singleton.class){ if(instance == null){ // 再检查一次 instance = new Singleton(); } } } return instance; } }