江湖开发者 | Java粉
网站地图
首页> Java优化> 单例模式 - 3种写法
2015
12-12

单例模式 - 3种写法

 

什么时候用

1. 创建时象时消耗过大。

 

2. 频繁的创建销毁

 

3. 提供全局访问点,只有一个实例



单例模式        

         单例模式是设计模式中使用最为普遍的模式之一。它是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。在Java语言中,这样的行为能带来两大好处:

1)对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销。

2)由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间。

因此对于系统的关键组件和被频繁使用的对象,使用单例模式便可以有效地改善系统的性能。

单例类的写法注意

         单例类必须有一个private访问级别的构造函数,确保单例不会在系统中其他代码内被实例化,其次instance成员变量和getInstance()方法必须是static的。

 

三种写法    

单例模式 有饿汉式、懒汉式、还有一种内部类方式(在此之前有没有见过内部类方式的?如果没有get吧。)

1.       饿汉式:直接实例化对象没有延迟加载。

2.       懒汉式:有了延迟加载,但因引用线程安全问题引入了synchronized 关键字效率会降低。

3.       内部类方式:即解决了延迟加载问题,也不存在效率问题。

 

饿汉式:

public class Singleton {

   private Singleton(){

     System.out.println("Singleton is create"); //创建单例的过程可能会很慢;

   }

   private  static Singleton instance = new Singleton();

     public static Singleton getInstance(){

     return instance;

   }

}

懒汉式:

public static LazySingleton getInstance(){

      if(instance==null){

            synchronized(LazySingleton.class){

               if(null==instance){

                 instance=new LazySingleton();

               }

            }

      }

      return instance;

}

内部类方式:

public class StaticSingleton {

   private StaticSingleton(){

   }

   private static class SingletonHolder{

     private static StaticSingleton instance = new StaticSingleton();

   }

   public static StaticSingleton getInstance(){

     return SingletonHolder.instance;

   }

}

 

/**

    * 在这个实现中,单例模式使用内部类来维护单例的实例,当StaticSingleton被加载时,

    * 其内部类并不会被初始化,故可以确保当StaticSingleton类被载入JVM时,不会被初

    * 始化单例类,而当getInstance()方法被调用时,才会加载 SingleHolder,从而初

    * 始化instance.

    * 同时,由于实例的建立是在类加载时完成,故天生对多线程友好,getInstance()方法不

    * 需要使用同步关键字。因此这种实现方式同时兼备以上两种实现的优点。

    */

   /**

    * 注意:使用内部类的方式实现单例,既可以做到延迟加载,也不必使用同步关键字,是一种比较

    * 完善的实现。

    */    


单例应用场景

1.       缓存管理类

2.       在线用户统计

3.       数据库连接池

4.       配置文件读取


                                         

Java江湖     
全部评论:

表情验证码,看不清楚,换一张

随机文章

云标签

公众号

微信

分享:分享我们的知识;专注:专注个人技术的提升;