单例模式之懒汉式和饿汉式


文章目录

  • 单例模式之懒汉式和饿汉式
  • 一、单例模式是什么?
  • 二、几种单例模式
    • 1.懒汉模式
    • 2.饿汉模式
  • 三、懒汉模式和饿汉模式的区别

一、单例模式是什么?

保证整个系统中一个类只有一个对象的实例,实现这种功能的方式就叫单例模式。
单例模式实现格式一般为:

  1. 构造方法私有化
  2. 定义一个该类的静态变量
  3. 对外提供一个public返回实例的静态方法

二、几种单例模式

1.懒汉模式

在初始化类的时候,不创建唯一的实例,而是等到真正需要用到的时候才创建。可以理解为一个懒人,饿的时候才想起要创建一个(吃饭)对象。
注意必须加上同步,否则有可能依然创建多个实例。

代码如下:

//多线程下的单例模式 懒汉模式
public class A1 {//定义一个该类的静态变量public static A1 a;//构造方法私有化private A1(){}//对外提供一个public返回实例的静态方法public synchronized static A1 getInstance(){if (a==null){//如果该变量为null,生成该对象a = new A1();return a;}else {//如果不为不null,直接返回该对象return a;}}
}
//测试类
public class TestA1 extends Thread{@Overridepublic void run() {//调用A1的getInstance()方法的hashCode值,即对象的哈希值,来判断是否为单例System.out.println(Thread.currentThread().getName()+"--->"+A1.getInstance().hashCode());}public static void main(String[] args) {TestA1 threadA1 = new TestA1();threadA1.setName("苹果");threadA1.start();TestA1 threadA2 = new TestA1();threadA2.setName("香蕉");threadA2.start();TestA1 threadA3 = new TestA1();threadA3.setName("橘子");threadA3.start();}
}

运行结果如下,通过哈希值可以判断是一个单例对象。

2.饿汉模式

在初始化的时候,就创建了唯一的实例,不管是否需要用到。就像一个饿了好久的人,一上来就先创建一个(吃饭)对象。不需要自己加同步,一定产生唯一的实例。

代码如下:

//单例模式之饿汉模式
public class E {//定义一个该类的静态变量private static E e = new E();//构造方法私有化private E(){}//对外提供一个public返回实例的静态方法public static E getInstance(){return e;}
}
//测试类
public class TestE extends Thread{@Overridepublic void run() {//调用E的getInstance()方法的hashCode值,即对象的哈希值,来判断是否为单例System.out.println(Thread.currentThread().getName()+"--->"+E.getInstance().hashCode());}public static void main(String[] args) {TestE testE1 = new TestE();testE1.setName("苹果");testE1.start();TestE testE2 = new TestE();testE2.setName("香蕉");testE2.start();TestE testE3 = new TestE();testE3.setName("橘子");testE3.start();}
}

运行结果如下,通过哈希值可以判断是一个单例对象。

三、懒汉模式和饿汉模式的区别

  1. 饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。

  2. 从实现方式来讲他们最大的区别就是懒汉式是延时加载,懒汉式是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,饿汉式无需关注多线程问题,写法简单明了,能用则用。但是它是加载类时创建实例。所以如果是一个工厂模式,缓存了很多实例,那么就得考虑效率问题,因为这个类一加载则把所有实例不管用不用一块创建。

  3. 两者建立单例对象的时间不同。“懒汉式”是在你真正用到的时候才去建这个单例对象,“饿汉式”是在不管用不用得上,一开始就建立这个单例对象。

经典案例:单例模式之懒汉式和饿汉式相关推荐

  1. java单例模式之懒汉式与饿汉式

    首先我们介绍一下单例模式 单例类是只有一个实例对象: 该单例对象必须由单例类自行创建: 单例类对外提供一个访问该单例的全局访问点. 单例模式的优点 单例模式可以保证内存里只有一个实例,减少了内存的开销 ...

  2. JAVA单例模式:懒汉式,饿汉式

    今天复习了一下java的单例模式,写了懒汉式和饿汉式的实现例子.代码如下: 1.懒汉式单例 package com.lf.shejimoshi;/*** @classDesc: 类描述:(懒汉式单例测 ...

  3. 单例模式(懒汉式和饿汉式)及如何实现线程安全

    单例模式有两种:懒汉式和饿汉式. 1 #include <iostream> 2 3 using namespace std; 4 5 6 // 保证在整个程序运行期间,最多只能有一个对象 ...

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

    单例模式 所谓单例模式,就是保证类在内存中只有一个对象 而如何保证类在内存中只有一个对象? 思考一下,我们平时在实例化类的对象时,基本都是通过new 的方式来实例化一个对象,其实说白了,就是调用了需要 ...

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

    单例模式一般有两种形式:懒汉式和饿汉式. 饿汉式是线程安全的,它的基本实现代码如下: public class SingletonTest1 {public static void main(Stri ...

  6. 单例模式之懒汉式和饿汉式

    目录 单例模式 懒汉式和饿汉式 懒汉式: 默认不会实例化,用的时候 new 饿汉式代码实现: 懒汉式和饿汉式区别: 懒汉模式: 饿汉模式: 执行效率上: 性能上: 单例模式 特点 : 只产生一个实例 ...

  7. 单例模式:懒汉式和饿汉式

    所谓单利模式,即只能开启一个线程,只有一个实例,并且能够实现自我实例化,主要分为懒汉式和饿汉式. (1)饿汉式 所谓饿汉式,就好比一个饿汉饿了好久,然后某一天到了餐厅,由于饿了很久,所以进入餐厅就希望 ...

  8. 单例模式:懒汉式和饿汉式(个人理解)

    懒汉式 /*** 懒汉式单例模式概念:* 不主动创建,在没有的情况下才会创建唯一实例,并且对象私有,构造私有*/ public class SingletonLan {/*** 私有的对象* 加vol ...

  9. java中的单例模式:懒汉式和饿汉式和静态内部类的书写

    饿汉式: public class SingleTon {//1.私有化构造器private SingleTon(){}//2.在类内部创建一个对象private static SingleTon i ...

最新文章

  1. 杨振宁:宇宙有没有造物者?
  2. Shell中自定义函数
  3. AC日记——[SDOI2010]大陆争霸 洛谷 P3690
  4. Kyoya and Photobooks
  5. javascript引擎执行的过程的理解--执行阶段
  6. Educational Codeforces Round 9 A. Grandma Laura and Apples 水题
  7. java 数据库连接不上_真心求助用java连接数据库时为什么总是连接不上
  8. PostgreSQL学习的九层宝塔
  9. php 环状,CSS3能写出这种环状吗,不是环形进度条?
  10. Damp;G“辱华”争议广告女主发声:几乎断送了模特事业
  11. 条形码类型和标准指南:一维、二维条码符号
  12. W806/W801/W800多通道ADC同时使用
  13. 数据标注员需要专业系统的学习么?
  14. Arduino - 摇杆模块
  15. 如何将计算机基础拷到u盘上,怎么把电脑上的CAD拷贝到u盘里
  16. eap-peap/mschapv2
  17. 利用matlab批量修改文件名称或后缀
  18. 大数据与编程语言关系
  19. 如何使自定义模块加入DNN搜索引擎(转)
  20. java时间代码_java处理日期时间代码

热门文章

  1. Gurobi处理非线性目标函数和约束的详细案例
  2. photoshop教程视频_设计时尚的视频播放器界面– Photoshop教程
  3. 修改密码 passwd
  4. java计算机毕业设计五金机电市场批发零售管理信息系统源码+数据库+系统+lw文档+mybatis+运行部署
  5. ❤啊!这就被黑了?❤ Redis 报 EXECABORT Transaction discarded because of previous errors 错误及解决方案❤️
  6. 心理学博士vs计算机博士,心理学博士、知乎大神告诉你怎么成为一个厉害的人...
  7. Tomcat 发布部署jsp网站—-使用自己的ip访问jsp网站
  8. text-align-last: justify;文本对齐ios失效问题解决
  9. 电子商务中的社会化营销逻辑 三个成功案例的启发
  10. PTA每日一题-Python-求圆面积