懒汉:在初始化类的时候,不创建唯一的实例,而是等到真正需要用到的时候才创建。必须加上同步,否则有可能依然创建多个实例。
饿汉:在初始化的时候,就创建了唯一的实例,不管是否需要用到。不需要自己加同步,一定产生唯一的实例。
懒汉代码
饿汉代码
从上面两个代码来看,由于懒汉模式下,每次获取实例都需要判断,如果使用非常频繁的时候,这种方式性能肯定有所下降。
而在饿汉模式下,不管是否用到,都会初始化实例。
这种是我比较推荐的做法:因为不使用对象的类,就不需要单例模式!既然需要用到对象,为何不在一开始就初始化好?
饿汉:在初始化的时候,就创建了唯一的实例,不管是否需要用到。不需要自己加同步,一定产生唯一的实例。
懒汉代码
public class Singleton { // 私有的、静态的成员保存唯一的实例 private static Singleton inst; // 私有构造器,避免被别人创建实例 private Singleton(){} // 提供一个公共的、静态的方法,获取唯一的实例 public static Singleton getInstance() { // 很多示例代码都是在方法上加同步,但是基于“最小范围原则”,应该要用同步代码块 // 这样可以尽可能提升程序的并发性能 synchronized( Singleton.class ) { // 判断inst是否为null,如果是null则新建一个 if( inst == null ) { inst = new Singleton(); } } return inst; } }
饿汉代码
public class Singleton { // 私有的、静态的成员保存唯一的实例 // 在类被第一次使用的时候,就已经完成了加载。类的加载过程,系统保证线程安全。 private static Singleton inst = new Singleton(); // 私有构造器,避免被别人创建实例 private Singleton(){} // 提供一个公共的、静态的方法,获取唯一的实例 public static Singleton getInstance() { return inst; } }
从上面两个代码来看,由于懒汉模式下,每次获取实例都需要判断,如果使用非常频繁的时候,这种方式性能肯定有所下降。
因此懒汉模式下,不适合使用太频繁的对象。
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
而在饿汉模式下,不管是否用到,都会初始化实例。
这种是我比较推荐的做法:因为不使用对象的类,就不需要单例模式!既然需要用到对象,为何不在一开始就初始化好?