`
r361251
  • 浏览: 4718 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

设计模式-单例模式

阅读更多
单例模式-要点:   
    1.确保程序中一个类最多只有一个实例,并提供访问这个实例的全局点。
    2.在Java中事先单例模式需要私有的构造器、一个静态方法和一个静态变量。
    3.确定在性能和资源桑的限制,然后小心滴选择适合的方案来实现单例,以解决多线程问题。
    4.如果不是在采用第五版的JavaEE,双重检查几所实现会失效。
    5.小心,你如果使用多个类加载器,可能导致单例失效而产生多个实例。

  
//单例模式-简单实例:
public class Singleton{
   //利用一个静态变量来记录Singleton类的唯一实例;
   private static Singleton uniqueInstance;
  
  //把构造器声明为私有的,只有自Singleton类内才可以调用构造器;
   private Singleton(){}
   
   //用getInstance方法实例化对象,并返回这个实例。
   public static Singleton getInstance(){
      if(uniqueInstance == null){
	      uniqueInstance=new Singleton();
	  }
	  return uniqueInstance;
   }
   
}
   


单例模式-多线程:   
    只要把getInstance()变成同步(synchronized)方法,多线程灾难几乎就可以轻易地解决了。(但影响性能)
    改善多线程性能问题?
    1.如果getInstance()的性能对应用程序不是很关键,就什么都别做。
    2.使用“急切”创建实例,而不是延迟实例化的做法。
    3.用“双重检查加锁”,在getInstance()中减少使用同步。
  
//单例模式-多线程:
public class Singleton{
   //利用一个静态变量来记录Singleton类的唯一实例;
   private static Singleton uniqueInstance;
  
  //把构造器声明为私有的,只有自Singleton类内才可以调用构造器;
   private Singleton(){}
   
   //用getInstance方法实例化对象,并返回这个实例。
   public static Singleton getInstance(){
      //第一次检查是否已经实例。
      if(uniqueInstance == null){
		 //要先等候别的线程执行完,不会有两个线程可以同时进入。
	     synchronized(Singleton.class){
              //第二次检查是否已经实例。
			 if(uniqueInstance == null){
				 uniqueInstance=new Singleton();
			 }
		 }
	  }
	  return uniqueInstance;
   }
   
}

  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics