Java设计模式之Singleton单例模式

1,什么是单例模式

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。

如:俺有 个帅气的老公,她们的老婆都是我,我就是我们家里的老婆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: 获得实例
posted @ 2018-05-27 22:02  H+  阅读(138)  评论(0编辑  收藏  举报