设计模式(二):单例模式

单例模式:用来创建只能有一个实例的对象。确保一个类只有一个实例,并提供一个全局访问点。

有的时候我们不希望一个类被创建出多个对象,因为多个实例会带来许多不好的影响。

经典单例模式:

public class SingleInstance {
           private static SingleInstance instance;
           private SingleInstance(){}
           public static SingleInstance getInstance(){
               if(instance == null){
                   instance = new SingleInstance();
           }
               return instance;
    }
    ...........
}

在类中定义静态变量记录类的唯一实例,然后定义一个私有的构造器,这样外部便无法实例化,再声明一个getInstance()方法实例化对象,并返回实例。

这样,当外部想实例化时,只需要调用SingleInstance.getInstance()方法便可获得唯一的实例。

 

但是上述经单例模式在处理多线程时还是会遇到错误,经常会被多个线程同时调用。

通过增加synchronized关键字到getInstnce()方法中,变成同步方法,就可以解决多线程问题。

但是同步方法会引发性能问题,每次都要同步这个方法,但事实上只要第一次同步即可。

所以最完善的办法便是采用 ”双重检查加锁“,在getInstance()方法中减少使用同步。

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

private volatile static SingleInstance instance;

volatile关键词确保当instance变量被初始化成实例时,多个线程正确处理instance变量。

getInstance()方法只在第一次彻底执行全部代码。

 

转载于:https://www.cnblogs.com/kinsomy/p/5151474.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值