线程安全的单例模式的几种实现


单例模式是常见的设计模式之一:目的是节省内存,限制了实例的个数;有利于java GC回收机制。

  

  单例模式的三个好处:

    1.控制资源的使用,通过线程同步来控制资源的并发访问

    2.控制实例的产生个数,来达到节约资源的目的

    3.作为通信媒介使用,在不建立连接的情况下,让两个不先关的进程和线程之间实现通信

 

单例模式分类: 饿汉模式(在类加载时便会创建对象);

        懒汉模式(在外部第一次请求实例时才会创建实例);

        登记式模式

 

单例模式特点:

    1.单例类只有一个实例

    2.单例类必须自己创建自己唯一的实例

    3.单例类必须自己给其他类提供这一实例

 

1.懒汉模式:类加载时不会初始化,当外部第一次请求实例时才会创建实例;而且第一次创建后不在创建该实例;

    特点是:运行时获取对象的速度比较慢,但加载的时候比较快,它在整个生命的应用周期只占用一部分资源

 

//单例模式-懒汉式单例
public class LazySingleton {
     //私有静态对象,加载时候不做初始化
     private static LazySingleton jjy=null;
     // 私有构造方法,避免外部创建实例
     private LazySingleton(){}

     /**
      * 静态工厂方法,返回此类的唯一实例. 
      * 当发现实例没有初始化的时候,才初始化.
      * @return LazySingleton
      */
     synchronized public static LazySingleton getJjy(){
         if(jjy==null){
             jjy=new LazySingleton();
         }
         return jjy;
     }
}

2.饿汉模式:类加载时就会初始化,创建实例;

      特点是:运行时获取对象速度比较快,但加载时速度比较慢,会一直占用资源  (程序打开加载比较慢,但运行速度快---从用户体验角度来说推荐饿汉)

//单例模式-饿汉式单例
public class EagerSingleton {
//私有静态对象,加载时候不做初始化
private static EagerSingleton jjy=new EagerSingleton();
// 私有构造方法,避免外部创建实例
private EagerSingleton(){}

/**
* 静态工厂方法,返回此类的唯一实例.

*
*/
synchronized public static EagerSingleton getJjy(){

return jjy;
}
}

 

 

 使用场景:数据库连接池;网站计数器;

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM