单例模式
单例模式
aqu-spring 发表于4年前
单例模式
  • 发表于 4年前
  • 阅读 28
  • 收藏 4
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: java实现单例模式
public class Singleton{
  private static Singleton singleton;//利用一个静态变量记录Singleton类的唯一实例
  
  private Singleton(){}//把构造函数私有,只有Singleton类内才可以调用调用构造器
  
  //用getInstance()方法实例化对象,并返回这个实例。
  public static Singleton getInstance(){
     if(singleton==null){
       singleton=new Singleton();
     }
     return singleton;
  }
  
}

以上例子初步实现了单例模式,但是以上实现没有考虑线程安全问题。所谓线程安全是指:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。显然以上实现并不满足线程安全的要求,在并发环境下很可能出现多个Singleton实例。

这时候只要把getInstance()变成线程同步(synchronized)多线程灾难几乎就可以轻易解决了.来看下面的例子。。。。

public class Singleton{
  private static Singleton singleton;
  
  private Singleton(){}
  
//通过增加synchronized关键字到getInstance()方法中,我们迫使每个线程在进入这个方法之前,要先等到别的线程离开改方法。也就是说,不会把两个线程可以同时进入这个方法。
  public static  synchronized Singleton getInstance(){
     if(singleton==null){
       singleton=new Singleton();
     }
     return singleton;
  }
  
}

以上的例子很简单地实现了单例模式,保证了线程的同步,但是我们又注意到了一个问题,每次进入getInstance()都要线程同步,我们知道,同步会降低性能。

使用“急切”创建实例,而不用延迟实例化的做法

(如果应用程序总是创建并使用单件视力表,或者在创建和运行时方面的负担不太繁重)

public class Singleton{
  private static Singleton singleton=new Singleton();
  
  private Singleton(){}//把构造函数私有,只有Singleton类内才可以调用调用构造器
  
  public static Singleton getInstance(){
     
     return singleton;
  }
  
}

利用这个做法,我们依赖JVM在加载这个类时马上创建唯一的单件实例。JVM保证在任何线程访问singleton静态变量之前,一定先创建此实例。

用“双重检查加锁”,在getInstance()中减少使用同步

(利用双重检查加锁,首先检查是否实例已经创建了,如果没有,“才”进行同步,这样一来,只有第一次会同步,这是我们想要的)

public class Singleton{
  private  volatile static Singleton singleton;
  
  private Singleton(){}
 
  public static Singleton getInstance(){
     if(singleton==null){
     synchronized (Singleton.class){
         if(singleton==null){
           singleton=new Singleton();
          }
       }
     }
     return singleton;
  }
  
}



共有 人打赏支持
粉丝 0
博文 17
码字总数 12097
×
aqu-spring
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: