单例模式的5种实现

举报
sinslu 发表于 2021/08/03 19:46:26 2021/08/03
【摘要】 单例模式的5种实现
1、饱汉模式(懒汉模式)
优点:懒加载启动快,资源占用小,使用时才实例化,无锁。
缺点:非线程安全。

public class Singleton1 {
  private static Singleton1 singleton = null;
  private Singleton1() {
  }
  public static Singleton1 getInstance() {
    if (singleton == null) {
      singleton = new Singleton1();
    }
    return singleton;
  }
}
2、饱汉模式(懒汉模式)--线程安全
优点:同上,但加锁了。
 缺点:synchronized 为独占排他锁,并发性能差。即使在创建成功以后,获取实例仍然是串行化操作。
public class Singleton {
    private static Singleton uniqueInstance = null;
    private Singleton(){}
    public static synchronized Singleton getInstance(){
        if(uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

3、饱汉模式(懒汉模式)--双重加锁检查DCL(Double Check Lock)
 优点:懒加载,线程安全。
 注:实例必须有 volatile 关键字修饰,其保证初始化完全。
public class Singleton {

    /**
     * 对保存实例的变量添加volatile的修饰
     */
    private volatile static Singleton instance = null;

    private Singleton(){ }

    public static Singleton getInstance(){
//先检查实例是否存在,如果不存在才进入下面的同步块
        if(instance == null){
//同步块,线程安全的创建实例
            synchronized(Singleton.class){
//再次检查实例是否存在,如果不存在才真的创建实例
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
4、饿汉模式
 优点:饿汉模式天生是线程安全的,使用时没有延迟。
 缺点:启动时即创建实例,启动慢,有可能造成资源浪费。
public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton(){
    }
    public static Singleton getInstance(){
        return instance;
    }
}

5、Holder模式
public class Singleton {
  /**
       * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
       * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
       */
    public static class SingletonHolder{
        private static Singleton instance = new Singleton();
    }

    private Singleton() {
        System.out.println("初始化单例");
    }
    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。