设计优化之单例模式

举报
西魏陶渊明 发表于 2022/09/25 04:13:51 2022/09/25
【摘要】 写一个简单的单例模式 public class Singleton{ private Singleton(){ ... } private static Singleton instance=new Singleton(); public static Singleton getInstance(){ ...
写一个简单的单例模式
public class Singleton{
  private Singleton(){
    ...
  }
  private static Singleton instance=new Singleton();
  
  public static Singleton getInstance(){
    return instance;
  }
}

  • 此种方法,简单没有任何修饰,但是单例是static修改的也就是说,类加载时候就会创建,当私有构造里面耗时较长的时候,类初始化会变得很慢,切每次调用getInstance方式都会初始化一次,所以会很费时,但是非大型项目,对程序要求高的项目中,也是可以使用的。笔者在工作初期,经常使用这种方式
懒加载单例
public class LazySingleton{
  private LazySingleton(){
  ...
  }
  private static LazySingleton instance=null;
  public static synchronized LazySingleton getInstance(){
    if(instance==null){
      instance=new LazySingleton();
    }
    return instance;
  }
}

  • 此方法虽然也有可能在私有构造中加载耗时操作,但是在类初始化时候并未创建,而是在调用getInstance时候才会创建,切只会创建一次,但是要用关键字修改,防止线程一正创建时候,线程二判断为null,又创建。但是明显当看到synchronized关键字,它在多线程时候的效率就不会高了,此方法笔者不经常使用。

重头戏优化的单例

/**
 * Created by mac on 2017/6/3.
 * 单例模式:
 * 此种方法好处,
 * 静态内部类并不会直接加载,当调用instance方法时候才会加载
 * 
 * 使用同步关键字修饰的会降低速度
 */
public class StaticSingleton {
    private StaticSingleton(){
    }
    private static class SingletonHolder{
        private static StaticSingleton instance=new StaticSingleton();
    }
    public static StaticSingleton getInstance(){
        return SingletonHolder.instance;
    }
}
  • 当StaticSingleton被加载时候,内部类并不会加载,当调用getInstance方法时候,才会初始化,由于实例是在类加载完成是建立,所以天生对线程友好。

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/102425293

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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