单件模式

设计模式 专栏收录该内容
10 篇文章 0 订阅

单件模式

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
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

tyisi

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值