设计模式---单例模式 (转)
看别人写的设计模式 觉得很好。
引用别人的 自己就不造轮子了。。。。。
转载 http://liuqing9382.iteye.com/blog/1441661
单例模式:
三个要点:
1.某个类只能有一个实例。
2.它必须自行创建这个实例;
3.它必须自行向外提供这个实例。
饿汉式:
public class Singleton{ private static Singleton singleton = new Singleton (); private Singleton (){} public Singleton getInstance(){ return singletion; } }
优点:
1.线程安全
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快
缺点:
资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化
懒汉式: (懒加载的思想,用到才会初始化实例)
public class Singleton{ private static Singleton singleton = null; public static synchronized Singleton getInstance(){ if(singleton==null){ singleton = new Singleton(); } return singleton; } }
优点:
资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法
缺点:
第一次加载时不够快,多线程使用不必要的同步开销大
比较:
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变。
懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的,
推荐使用第一种
假设多线程访问的时候,线程1在在new Instence() 系统分配内存需要0.01秒时间 ,但就这这个0.01秒 又有其他的线程访问了,这时候就要再次instance 还是为null 又要再次new
导致了线程不安全。
双重检测:
class Singleton4 { private Singleton4() {} public static Singleton4 instance = null; public static Singleton4 getInstance() { if (instance == null) { synchronized (Singleton4.class) { if (instance == null) { instance = new Singleton4(); } } } return instance; } }
优点:
资源利用率高,不执行getInstance()就不被实例,可以执行该类其他静态方法
缺点:
第一次加载时反应不快,由于java内存模型一些原因偶尔失败
静态内部类:
class Singleton5 { private Singleton5() {} private static class SingletonHelp { static Singleton5 instance = new Singleton5(); } public static Singleton5 getInstance() { return SingletonHelp.instance; } }
优点:
资源利用率高,不执行getInstance()不被实例,可以执行该类其他静态方法
缺点:
第一次加载时反应不够快