https://v.qq.com/x/page/e0364ung5zp.html

讲的不错, 关于 饿汉式单例模式

code

Student 类:

package com.test;
//单例模式之       饿汉     模式 eager singleton
public class Student {
    //构造函数私有,别人无法 new 实例
    private Student(){}
    //自己造一个实例
    private static Student student = new Student();//饿汉模式:直接 new 了一个 instance。线程安全
    public static Student getStudent()
    {
        return student;
    }
}

测试类:

package com.test;
//单例模式,保证类在内存中只有一个实例
public class StudentTest {
    public static void main(String[] args) {
        Student student1 = Student.getStudent();
        Student student2 = Student.getStudent();
        System.out.println(student1);
        System.out.println(student2);
        System.out.println(student1 == student2);
    }
}

======结果===========

com.test.Student@7852e922
com.test.Student@7852e922
true

 上面是  饿汉式 单例模式。

 

下面看看懒汉式:

 Person 类:

package com.test;
//单例模式之       懒汉    模式  lazy singleton
public class Person {
    private Person() {};
    private static Person person; //懒汉模式并不直接 new instance
    
    public static Person getInstance()
    {
        if (person == null) //这里其实不是线程安全的。后续可以 enhance
        {

person = new Person();

return person;//只有当调用getInstance的时候,才回去初始化这个单例。
        }
        return person;
    }
}

 测试类:

package com.test;
public class PersonDemo {
    public static void main(String[] args) {
        Person person1 = Person.getInstance();
        Person person2 = Person.getInstance();
        System.out.println(person1 == person2);
    }
}

=======总结==========

饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了。
而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。

饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,

懒汉式本身是非线程安全的,为了实现线程安全有几种写法。

package com.test;
//单例模式之       懒汉    模式  lazy singleton
public class Person {
    private Person() {};
    private static Person person; //懒汉模式并不直接 new instance
    
    public static synchronized  Person getInstance() //这里加上 synchronized 保证线程安全
    {
        if (person == null)
        {
            person = new Person();//只有当调用getInstance的时候,才回去初始化这个单例。
            return person;

}
        return person;
    }
}

java 设计模式 单例模式之饿汉模式/懒汉模式 singleton pattern的更多相关文章

  1. 瞎扯设计模式1:单例模式 饿汉模式 懒汉模式 线程安全的单例 singleton 设计模式 java

    [原创声明]此文为本人原创,欢迎转载,转载请注明出处,作者链接~ http://www.cnblogs.com/m-yb/p/8833085.html 单例很常用,面试也经常被问,如:不用自定义锁怎么 ...

  2. Java设计模式 - 单例模式 (懒汉方式和饿汉方式)

    概念: Java中单例模式是一种常见的设计模式,单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的写法有好几种,这 ...

  3. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  4. Spring中单例模式中的饿汉和懒汉以及Spring中的多例模式

    链接:https://pan.baidu.com/s/1wgxnXnGbPdK1YaZvhO7PDQ 提取码:opjr 单例模式:每个bean定义只生成一个对象实例,每次getBean请求获得的都是此 ...

  5. Java设计模式 - - 单例模式 装饰者模式

    Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...

  6. 【设计模式】Java设计模式 - 单例模式

    [设计模式]Java设计模式 - 单例模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 分享学习心得,欢迎指正,大家一起学习成长! 原创作品,更多关注我CSDN: ...

  7. 我的Java设计模式-单例模式

    就算不懂设计模式的兄弟姐妹们,想必也听说过单例模式,并且在项目中也会用上.但是,真正理解和熟悉单例模式的人有几个呢?接下来我们一起来学习设计模式中最简单的模式之一--单例模式 一.为什么叫单例模式? ...

  8. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

  9. 单例设计模式Singleton之懒加载模式(懒汉模式)【原】

    单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...

随机推荐

  1. 互联网安全架构之常见的Web攻击手段及解决办法

    一.Web 安全常见攻击手段 XSS(跨站脚本攻击) SQL 注入 CSRF(跨站请求伪造) 上传漏洞 DDoS(分布式拒绝服务攻击)等 二.攻击手段原理及解决方案 1.XSS攻击 原理:XSS 攻击 ...

  2. jq sku实现

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. (转)Java并发编程:核心理论

    原文链接:https://www.cnblogs.com/paddix/p/5374810.html Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及 ...

  4. kvm虚拟机热迁移

    一.热迁移描述: 相比KVM虚拟机冷迁移中需要拷贝虚拟机虚拟磁盘文件,kvm虚拟机热迁移无需拷贝虚拟磁盘文件,但是需要迁移到的宿主机之间需要有相同的目录结构虚拟机磁盘文件,也就是共享存储,本文这部分内 ...

  5. SecureCRT 连接 Centos7.0 (桥接模式),且能连接公网。

    1.查看本地网络信息 ip:172.20.10.7 2.在VMware下配置Centos为桥接模式: 3.在Centos命令行输入 ip addr 查看Centos的mac地址 网口:eno16777 ...

  6. Freeradius+Cisco2500AC+OpenLdap认证

    为了将公司内部认证统一化,启用了802.1x认证,认证流程如下: UserClient->AC控制器->Freeradius->OpenLdap 其中: Freeradius做认证使 ...

  7. 谈谈我所理解的HashMap和HashTable

    HashMap和HashTable之间的联系和区别如下: 1.HashMap几乎可以等价于Hashtable,但是它们之间继承不同:HashMap extends AbstractMap implem ...

  8. zencart只有购买过此产品的客户才能评价产品

    当前登录的客户买过此产品时,才显示评价按钮: <?php $rev_query = "select count(*) as count from orders o ,orders_pr ...

  9. 【AGC006 C】Rabbit Exercise

    题意 有 \(n\) 只兔子在数轴上,第 \(i\) 只兔子的初始坐标为整数 \(x_i\). 现在这些兔子会按照下面的规则做体操.每一轮体操都由 \(m\) 次跳跃组成:在第 \(j\) 次跳跃时, ...

  10. 高性能mysql 第7章 mysql高级特性之分区表

    分区表: 分区表是一个独立的逻辑表,底层通过多个物理表实现. mysql实现分区表的方式是对底层表的封装.这意味着没有全局索引,索引是建立在底层的每个表上的(跟ORACLE不一样). 用到分区表的几种 ...