`
dreamShow
  • 浏览: 10481 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Java之单例模式

    博客分类:
  • Java
阅读更多
    闲来无事,特发表文章一篇,谈谈自己对singleton模式的理解
   
    public class Singleton {
      private static Singleton instance ;//静态成员变量
    private Singleton(){}//私有构造方法
    public static synchronized  Singleton getInstance() {
       if(instance==null){
        instance = new Singleton()
        }
    return instance;   
   } 
   } 
   

singleton 模式保证在Java应用程序中,一个类Class只有一个实例存在,要注意以下几点:
1.声明的类成员变量是静态的,这样可以保存不被GC(垃圾回收)回收掉。
2.私有的构造方法,防止使用new 造对象,Singleton.getInstance()调用静态方法
   来获取实例。
3.getInstance方法加上synchronized变为同步方法,保存整个应用当中始终只有一个实例。 
2
5
分享到:
评论
4 楼 Heis 2010-07-21  
Heis 写道
没看过Effective Java吧,这单例是不是线程安全的。原因是在访问getInstance方法时,还是有可能得到一个没有初始化成功的实例的引用。可以参考原书单例的那章。

最简单的单例是在编译阶段就构建实例。
public class Singleton { 
    private final static Singleton instance=new Singleton() ;//静态成员变量 
  private Singleton(){}//私有构造方法 
  public static Singleton getInstance() {  
    return instance;    
}  
}



是我看错了 ,博主的方法加了synchronized,是线程安全的,没有则不安全。

博主可以删我的贴,以免误导别人。

但是博主写得这个单例每次调用synchronized方法是有效率损失,好处是实例可以等到方法调用时才构建。而我上面写得单例调用效率高,缺点是类在加载的时候就构建实例了,不管这个实例有没有使用到。
3 楼 dreamShow 2010-07-21  
mountain_king 写道
1楼是否能具体说明一下,为何下面会获得为null的对象

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

获得对象不会是null的;
在第一次调用Singleton.getInstance()方法,才实例化对象
以后再用Singleton.getInstance()方法时直接获取已经造好的对象

2 楼 mountain_king 2010-07-21  
1楼是否能具体说明一下,为何下面会获得为null的对象

public static synchronized  Singleton getInstance() {   
       if(instance==null){   
        instance = new Singleton()   
        }   
    return instance;      
   }   
1 楼 salever 2010-07-21  
还有一种单例模型,允许用户构建多个实例对象,但是这些对象使用共享的(static)数据成员。

相关推荐

Global site tag (gtag.js) - Google Analytics