关于单实例模式的认识

来源:互联网 发布:java编写九九乘法表 编辑:程序博客网 时间:2024/06/05 23:36
网上经常会有以下描述单例模式的实现方式以及评论:

实现1:

public class Singleton {

     private static Singleton instance;

      private Singleton (){ //首先有一个私有的构造器 

       }

     public static Singleton getInstance() {
     if(instance==null){
         instance=new Singleton ();
      }
      return instance;
     }

}

这种方式是线程不安全的,如果多个线程同时访问的话就可能有多个对象产生,如果在get方法中加同步块的话会影响性能。

实现2:

public class Singleton {
 
 private Singleton(){
  
 }
 private static Singleton instance =new Singleton();
 
 public static Singleton getInstance(){
  return instance;
 }

}

这种方式虽然不存在安全性问题,但是在程序启动的时候就会初始化。

实现3:

public class Singleton {

 private static class SingletonHolder {
  static Singleton instance = new Singleton();
 }

 public static Singleton getInstance() {
  return SingletonHolder.instance;
 }

}

3种方式中这是最好的解决方案,既解决了线程同步的问题,有在调用的时候才初始化。


同时也有仁兄这样评论:


人云亦云!误人子弟!什么叫“程序启动”?你这个Singleton中只有一个public方法,那么这个类的初始化只有两种可能:
1)、使用Class.forName(),此时会实行static语句。
2)、调用getInstance()方法。

那么只有1)是有性能问题的(你可能加载并初始化了这个类,但没有使用它,然而这种情况很少)。
至于2),是不存在性能问题的(因为只有这1个public方法,所以只有这个方法在第一调用时才初始化实例)

第三种方式是最好的的,但通常第二种方式都是简单可行的。


在评论之前首先要知道几个概念:

1.单实例模式是解决什么问题(为什么要用 单实例)

2.创建单实例会有哪些问题

3.怎么创建它,使它最为合理





经过测试和咨询资深java工程师得知以下方式是最好的,最实用的:

* 满足标准单实例的四个要素:
 *  1.该类必须是final类型
 *  2.必须要有一个私有的、静态的、final类型的一个该类的对象
 *  3.构造方法必须私有
 *  4.必须要有一个公有的、静态的、返回该单实例的一个对象的方法
 */

public final class Singleton
{
   private static final Singleton instance=new Singleton();
   private Singleton(){}

   public static Singleton getInstance(){
   return instance;
   }
}

参考:

1.http://dxblyq3320.iteye.com/blog/445100

2.内部资料

3.http://wushuangyan26.iteye.com/blog/1327985

原创粉丝点击