单例模式

所谓单例模式,就是保证类在内存中只有一个对象

而如何保证类在内存中只有一个对象?

思考一下,我们平时在实例化类的对象时,基本都是通过new 的方式来实例化一个对象,其实说白了,就是调用了需要实例化类的默认的构造方法,所以为了保证类只有一个对象,我们需要将类的对象设置为private

1)控制类的创建,不让其他类创建本类的对象,即需要设置private属性

2)在本类中定义一个本类的对象

public class test {public static void main(String[] args) {//分别实例化对象 s1,s2Singleton s1 = Singleton.singleton;Singleton s2 = Singleton.singleton;System.out.println(s1 == s2);}}
class Singleton{//私有的构造函数,保证外类不能实例化本类private Singleton(){}//自己创建一个类的实例化public static Singleton singleton  = new Singleton();
}

在这里输出一下,看一看s1和s2是不是引用的同一个实例s的地址

结果为true,可以看出,通过创建私有构造函数这样是可以保证单例的

但是,会有一个问题!!

public class test {public static void main(String[] args) {//分别实例化对象 s1,s2Singleton s1 = Singleton.singleton;//这里突然 将Singleton中的变成了nullSingleton.singleton = null;Singleton s2 = Singleton.singleton;System.out.println(s1 == s2);}}
class Singleton{//私有的构造函数,保证外类不能实例化本类private Singleton(){}//自己创建一个类的实例化public static Singleton singleton = new Singleton();
}

在执行main方法的时候,突然有个进程插了进来,将Singleton中的s变成了null(多线程中,很常见),这时就相当于引用了两个地址,即不符合了单例的定义

所有,只用private设置构造函数是不够的,为此,还需要进行第三步

3)提供公共的访问方式

public class test {public static void main(String[] args) {//分别实例化对象 s1,s2Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s1 == s2);}}
class Singleton{//私有的构造函数,保证外类不能实例化本类private Singleton(){}//自己创建一个类的实例化private static Singleton singleton = new Singleton();//创建一个get方法,返回一个实例spublic static Singleton getInstance(){return singleton;}
}

先将Sinleton类中的实例化私有(private),使得外界不能调用,然后创建要给get方法,返回一个实例s,这样,就保证了在外类中不能更改s的值,即保证了单例的实现

其实上述的方式 就是单例模式中的饿汉式

所谓饿汉式,就是直接创建出类的实例化;

而对于懒汉式,就是在需要的时候再创建类的实例化

class Singleton {// 私有的构造函数,保证外类不能实例化本类private Singleton() {}// 自己创建一个类的实例化private static Singleton singleton;// 创建一个get方法,返回一个实例spublic static Singleton getInstance(){//判断singleton是否为null,如果为null,即判定需要实例化if (singleton == null) {singleton = new Singleton();}return singleton;}
}

对于懒汉式,就是在getInstance方法中增加一个if判断,判断当前对象是否为null,如果为null,则创建实例

===============================分割线=============================================

这里来进行一个比较,究竟饿汉式和懒汉式哪一个更好;

饿汉式:简单来说就是空间换时间,因为上来就实例化一个对象,占用了内存,(也不管你用还是不用)

懒汉式:简单的来说就是时间换空间,与饿汉式正好相反

这时,会有人说,懒汉式比饿汉式更好,其实恰恰相反,这里举个例子!

public static Singleton getInstance(){//判断singleton是否为null,如果为null,即判定需要实例化if (singleton == null) {//singleton = new Singleton();}return singleton;}

比如,现在有A线程和B线程,A线程刚好在这个getInstance()方法中,刚刚判断完非空(此时为null),即需要创建实例,然而,就是这么巧,B线程抢到了CPU的执行权,A线程sleep了,这时,B线程也进行了这个判断,和A一样,都需要创建实例,而这时,A也抢到了CPU,这时,B就sleep了,然后A执行了实例化后,B又抢到CPU执行权,然后B也实例化,这时,出现问题了,A和B都实例化了一个对象,这就是赤果果的两个对象呀,单例呢,唯一呢,全都没了。

而且,上面说过,懒汉式和饿汉式的区别具体就是时间和空间的转换,现在开发的时候关心的应该还是时间,对于空间,完全可以通过硬件来优化呀,加大内存!!!但是减少时间计算就很麻烦了,额!!

所以说,对于懒汉式在多线程中式不支持的(仅个人观点,毕竟我的水平还不熟练),所以相对来说,更多的是用饿汉式

===============================分割线=============================================

之前百度单例的时候,发现还有第三种方法,简单试了一下,也能达到单例的效果,但是没有具体尝试,这里粘个代码和运行结果看看就好了

public class test {public static void main(String[] args) {// 分别实例化对象 s1,s2Singleton s1 = Singleton.singleton;// 在这里 更改singleton的值是不允许的,因为设置了final属性// Singleton.singleton = null;Singleton s2 = Singleton.singleton;System.out.println(s1 == s2);}
}class Singleton {// 私有的构造函数,保证外类不能实例化本类private Singleton() {}// 自己创建一个类的实例化public static final Singleton singleton = new Singleton();}

其实这种方法就是将singleton类中实例化方法加了一个final属性,就是不允许更改其值,所以在外类进行对其进行修改时,是不会允许的,同样达到了单例的效果。

单例模式(懒汉式和饿汉式区别)相关推荐

  1. 单例模式懒汉式和饿汉式区别

    单例模式懒汉式和饿汉式区别 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单 ...

  2. 单例模式——懒汉式和饿汉式详解

    单例模式属于创建型模式的一种,应用于保证一个类仅有一个实例的场景下,并且提供了一个访问它的全局访问点,如spring中的全局访问点BeanFactory,spring下所有的bean都是单例. 单例模 ...

  3. Java单例模式--------懒汉式和饿汉式

    Java单例模式--------懒汉式和饿汉式 单件模式用途: 单件模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用. 单件模式能够保证某一类型对象在系统中的唯一性,即某类在系统 ...

  4. 单例模式懒汉式和饿汉式的区别

    文章目录 一.单例模式 二.懒汉式和饿汉式 一.单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最 ...

  5. 单例模式——懒汉式和饿汉式

    所谓"懒汉式"与"饿汉式"的区别,是在与建立单例对象的时间的不同. "懒汉式"是在你真正用到的时候才去建这个单例对象: 比如:有个单例对象 ...

  6. [设计模式]单例模式(懒汉式,饿汉式)

    实现单例步骤: 1.构造函数私有化. 2.增加静态私有的当前类的指针变量. 3.提供静态对外接口,可以让用户获得单例对象. 单例 分为: 1.懒汉式 2.饿汉式 懒汉式 代码如下: class Sin ...

  7. Java单例模式--懒汉式和饿汉式(Demo)

    你好我是辰兮,很高兴你能来阅读,本篇文章为大家讲解Java单例模式,相关的更多面试知识已经提前整理好文章可以阅读学习,分享获取新知,希望对Java初学者有帮助. 1.JAVA基础面试常考问题 : JA ...

  8. 单例模式懒汉式和饿汉式的线程安全问题

    文章目录 单例模式(Singleton Pattern) 一.饿汉式 二.懒汉式 三.线程安全 单例模式(Singleton Pattern) 单例模式是 Java 中最简单的设计模式之一.这种类型的 ...

  9. 单例模式懒汉式和饿汉式入门详解

    一.简介 通俗例子: 你用杯子喝可乐,喝完了不丢,继续去倒果汁喝,就是单例. 你用杯子喝可乐,直接扔了杯子,换个杯子去倒果汁喝,就是多例. 上台面的说法: 所谓单例模式,简单来说,就是在整个应用中保证 ...

最新文章

  1. virsh 关机_KVM virsh常用命令篇
  2. 【NLP】ACL 2021中的25个Transformers模型
  3. 世界上没有一模一样的东西_世界上存在两根同时点燃同时燃尽一模一样的蜡烛吗?...
  4. CDMA的完整形式是什么?
  5. Linux学习之嵌入式Linux编程文件IO(C语言版)
  6. Python 爬虫+tkinter界面 实现历史天气查询
  7. 【机器学习-西瓜书】四、决策树:信息熵;信息增益;增益率;ID3;C4.5
  8. 主要植物叶片数据集农作物病害数据集
  9. tensorflow之预测手写字的概率
  10. jQuery自定义右键菜单
  11. ndk编译libiconv
  12. 小韦老师@神犇营-my1063-引爆炸弹
  13. 领域自适应论文(六十八):Implicit Class-Conditioned Domain Alignment for Unsupervised Domain Adaptation论文原理
  14. 虚拟中的多态与现实中多态
  15. JavaScript 教程「1」:与君初相识
  16. 最后一天了(再见了)
  17. 华为、OPPO、vivo、小米牵头制定快充协议统一技术
  18. C# NPOI 批量导出Excel 打包下载
  19. 蜂鸣器电路下拉电阻作用
  20. 霹雳火s毕老师_$_Java笔记(一)

热门文章

  1. 什么是虚拟内存(Virtual Memory)?
  2. MySQL笔记--MySQL排序查询(6)
  3. html中pre使用方法,HTML中pre标签的用法
  4. [LINUX]linux系统日志
  5. <<视觉问答AAAI>>2022:An Empirical Study of GPT-3 for Few-Shot Knowledge-Based VQA
  6. 众昂矿业:氟化工行业快速发展,但原材料供需紧张
  7. php中sscanf,sscanf
  8. 计算机音乐恋曲1990字谱,罗大佑恋曲1990曲谱
  9. Python情人节表白女神代码(修订版)
  10. js 余数 取_js取整数、取余数