天天看点

设计模式---单例模式 (转)

 看别人写的设计模式 觉得很好。

 引用别人的 自己就不造轮子了。。。。。

单例模式:

三个要点:

1.某个类只能有一个实例。

2.它必须自行创建这个实例;

3.它必须自行向外提供这个实例。

饿汉式:

 优点:

    1.线程安全

    2.在类加载的同时已经创建好一个静态对象,调用时反应速度快

缺点:

      资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化 

懒汉式: (懒加载的思想,用到才会初始化实例)

资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法

    第一次加载时不够快,多线程使用不必要的同步开销大

比较:

饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变。

懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的,

推荐使用第一种

  假设多线程访问的时候,线程1在在new Instence() 系统分配内存需要0.01秒时间 ,但就这这个0.01秒 又有其他的线程访问了,这时候就要再次instance 还是为null  又要再次new

  导致了线程不安全。

双重检测:

优点:

资源利用率高,不执行getInstance()就不被实例,可以执行该类其他静态方法

    第一次加载时反应不快,由于java内存模型一些原因偶尔失败

静态内部类:

优点:

    资源利用率高,不执行getInstance()不被实例,可以执行该类其他静态方法

缺点:

    第一次加载时反应不够快