单例模式确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可以使用。
java
如:俺有 6 个帅气的老公,她们的老婆都是我,我就是咱们家里的老婆Sigleton,她们只要说道“老婆”,都是指的同一我的,那就是我(刚才作了个梦啦,哪有这么好的事)
chrome
1,单例类只能有一个实例。
2,单例类必须本身建立本身的惟一实例。
3,单例类必须给全部其余对象提供这一实例。安全
1,饿汉式网络
饿汉式在类建立的同时就已经建立了一个静态的对象供系统使用,之后就再也不改变。多线程
//饿汉式单例类.在类初始化时,已经自行实例化 public class Singleton1 { private Singleton1() {} private static final Singleton1 single = new Singleton1(); //静态工厂方法 public static Singleton1 getInstance() { return single; } }
2,懒汉式1,非线程安全并发
懒汉式在类建立的时候没有建立了对象,只是进行声明,在用户调用getInstance方法的时候才进行建立。app
//懒汉式单例类.在第一次调用的时候实例化本身 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加上同步spa
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; } }
饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,
而懒汉式,只有当调用getInstance的时候,才回去初始化这个单例。
饿汉式天生就是线程安全的,能够直接用于多线程而不会出现问题,
懒汉式自己是非线程安全的,为了实现线程安全有几种写法,分别是上面的一、二、3,这三种实如今资源加载和性能方面有些区别。