Java设计模式之Singleton单例模式
1,什么是单例模式
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。
如:俺有 6 个帅气的老公,她们的老婆都是我,我就是我们家里的老婆Sigleton,她们只要说道“老婆”,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)
2,单例模式的特点
1,单例类只能有一个实例。
2,单例类必须自己创建自己的唯一实例。
3,单例类必须给所有其他对象提供这一实例。
3,单例模式的实现
1,饿汉式
饿汉式在类创建的同时就已经创建了一个静态的对象供系统使用,以后就不再改变。
//饿汉式单例类.在类初始化时,已经自行实例化 public class Singleton1 { private Singleton1() {} private static final Singleton1 single = new Singleton1(); //静态工厂方法 public static Singleton1 getInstance() { return single; } }
2,懒汉式1,非线程安全
懒汉式在类创建的时候没有创建了对象,只是进行声明,在用户调用getInstance方法的时候才进行创建。
//懒汉式单例类.在第一次调用的时候实例化自己 public class Singleton { private Singleton() {} private static Singleton single=null; //静态工厂方法 public static Singleton getInstance() { if (single == null) { single = new Singleton(); } return single; } }
以上懒汉式单利实现没有考虑线程安全问题,并发环境可能出现多个Singleton实例,要实现线程安全,需要对getInstance进行改造。
2,懒汉式2,给getInstance加上同步
public static synchronized Singleton getInstance() { if (single == null) { single = new Singleton(); } return single; }
2,懒汉式3,给getInstance加上双重检查锁定
public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; }
2,懒汉式4,给getInstance加上静态内部类
public class Singleton { private static class LazyHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return LazyHolder.INSTANCE; } }
4,饿汉式和懒汉式区别
饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,
而懒汉式,只有当调用getInstance的时候,才回去初始化这个单例。
饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,
懒汉式本身是非线程安全的,为了实现线程安全有几种写法,分别是上面的1、2、3,这三种实现在资源加载和性能方面有些区别。
网络释义
GetInstance: 获得实例