单件模式

单件模式

public class Singleton {

private static Singleton uniqueInstance;

private Singleton() {}

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

通过增加synchronized关键字到getInstance()方法中,我们迫使每个线程在进入这个方法之前,要先等到别的线程离开该方法。也就是说,不会有两个线程可以同时进入这个方法。

1、如果getInstance()的性能对应用程序不是很关键,就什么都别做

同步getInstance()的方法既简单又有效,但是,同步一个方法可能造成程序执行效率下降100倍。因此,如果将getInstance()的程序用在频繁运用的地方,你可能就得重新考虑了。

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

public class Singleton {

private static Singleton uniqueInstance=new Singleton();

private Singleton() {}

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

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

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

public class Singleton {

private volatile static Singleton uniqueInstance;

private Singleton() {}

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

饿汉 vs. 懒汉

  • 饿汉 声明实例引用时即实例化
  • 懒汉 静态方法第一次被调用前不实例化,也即懒加载。对于创建实例代价大,且不定会使用时,使用懒加载模式可以减少开销

静态代码块 饿汉


public class Singleton {
  private static Singleton INSTANCE;

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

静态内部类

public class Singleton {
  private Singleton() {};
  public static Singleton getInstance() {
    return InnerClass.INSTANCE;
  }

  private static class InnerClass {
    private static final Singleton INSTANCE = new Singleton();
  }
}

枚举

public enum Singleton {
  INSTANCE;

  public void whatSoEverMethod() { }
  // 该方法非必须,只是为了保证与其它方案一样使用静态方法得到实例
  public static Singleton getInstance() {
    return INSTANCE;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值