首页 > 代码库 > 2016/11/17

2016/11/17

1.单例设计模式

(1)懒汉模式

 1 public class Singleton {
 2 
 3     private Singleton() {}
 4     private static Singleton singleton = null;
 5    // 这里可以加同步锁解决线程安全问题  
 6     public static Singleton getInstance() {
 7         if(singleton == null) {
 8             singleton = new Singleton();
 9         }
10         return singleton;
11     }
12 }

 

(2)饿汉模式

 1 public class Singleton2 {
 2 
 3     public Singleton2() {
 4     }
 5     private static final Singleton2 singleton2 = new Singleton2;
 6 
 7     public static Singleton2 getInstance(){
 8         return singleton2;
 9     }
10 }

懒、饿汉之间的比较

(1)加载时机

  懒汉:懒汉很懒,只有当调用getInstance()方法时,才会初始化这个实例类

  饿汉:饿汉很饥饿,类一旦加载,实例就初始化完成,保证在调用getInstance()方法时,单利是已经存在的

(2)线程安全性

  懒汉:线程不安全.并发环境下很可能出现多个Singleton实例.解决办法是可以添加同步锁

  饿汉:饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题

 (3) 资源加载和性能:

  懒汉:延迟加载,第一次调用时才会初始化,性能上会有所延迟.

  饿汉:类创建的同时就实例化一个静态对象,不论之后是否用到这个对象,都已初始化并占用一定的内存.第一次调用个时候相对较快.

 (4)  懒汉设计模式线程安全问题的解决方案

利用了classloader的机制来保证初始化instance时只有一个线程,所以也是线程安全的,同时没有性能损耗

 1 public class SafeSingleton {
 2 
 3     public SafeSingleton() {
 4     }
 5     private static class LasyHolder{
 6         private static final SafeSingleton INSTANCE = new SafeSingleton();
 7     }
 8 
 9     public static final SafeSingleton getInstance(){
10         return LasyHolder.INSTANCE;
11     }
12 }

 

2016/11/17