单例模式: 懒汉式 饿汉式 登记式(Spring的IOC) 代码亲测(多线程测试)

news/2024/7/3 12:08:45

目录

第一种: 饿汉式(内存占用问题)

->上代码: 

第二种: 懒汉式(线程安全问题)

->上代码

第三种: 登记式(特殊)

具体情况介绍: 

 ->上代码: 

测试代码:

测试结果: 

单例模式使用场景->


 [三种情况都经过代码测试]

第一种: 饿汉式(内存占用问题)

 实现简单

服务开启的时候创建(一般小对象,频繁用)  缺点: 消耗资源非常大

->上代码: 

class Singleton {
    /**
     * 饿汉式
     */
    private Singleton() {
    } //这样其他不能new了

    private static final Singleton instance = new Singleton();

    public static Singleton getInstance() {
        return instance;
    }
}

第二种: 懒汉式(线程安全问题)

一般会出现多线程并发安全问题 只能加锁 如果直接加锁 性能非常差, 只能有条件的锁 没创建锁一次即可

采用双重验证

->上代码

public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) { //这步等效于在方法上添加synchronized
                if (instance == null) {
                    System.out.println("====> 只能执行第一次!!! <===");
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

 第三种: 登记式(特殊)

具体情况介绍: 

创建一个实例 有的时候,我们不希望在一开始的时候就把一个类写成单例模式,但是在运用的时候,我们却可以像单例一样使用他

最典型的例子就是spring,他的默认类型就是单例,spring是如何做到把不是单例的类变成单例呢?

这就用到了登记式单例

其实登记式单例并没有去改变类,他所做的就是起到一个登记的作用,如果没有登记,他就给你登记,并把生成的实例保存起来,下次你要用的时候直接给你。

IOC容器就是做的这个事,你需要就找他去拿,他就可以很方便的实现Bean的管理

 ->上代码: 

    private Singleton() {}
    
    public static Singleton getInstance() {
        return SingleNew.NEW_SINGLE;
    }
    
    private static class SingleNew {
        private static final Singleton NEW_SINGLE = new Singleton();
    }

测试代码:

 public static void main(String[] args) {

        Thread thread = new Thread() {
            @Override
            public void run() {
                System.out.println(Singleton.getInstance());
            }
        };
        Thread thread1 = new Thread() {
            @Override
            public void run() {
                System.out.println(Singleton.getInstance());
            }
        };
        Thread thread2 = new Thread() {
            @Override
            public void run() {
                System.out.println(Singleton.getInstance());
            }
        };

        thread.start();
        thread1.start();
        thread2.start();

    }

测试结果: 

====> 只能new执行第一次!!! <====
com.jt.common.mode.Singleton@5d7aa6cf
com.jt.common.mode.Singleton@5d7aa6cf
com.jt.common.mode.Singleton@5d7aa6cf

单例模式使用场景-> 

 看到一篇文章, 感觉不错

https://www.baidu.com/link?url=ugtcE-w62V8dNre4GX5yiBAVN4lz0uFp7VSrzarklDfZeIJP93SQp77Ny93j7cV-&wd=&eqid=fd61b3b7001797560000000262038b79https://www.baidu.com/link?url=ugtcE-w62V8dNre4GX5yiBAVN4lz0uFp7VSrzarklDfZeIJP93SQp77Ny93j7cV-&wd=&eqid=fd61b3b7001797560000000262038b79


http://www.niftyadmin.cn/n/2103135.html

相关文章

angular6 利用 ngContentOutlet 实现组件位置交换(重排)

ngContentOutlet指令介绍 ngContentOutlet指令与ngTemplateOutlet指令类似&#xff0c;都用于动态组件&#xff0c;不同的是&#xff0c;前者传入的是一个Component&#xff0c;后者传入的是一个TemplateRef。首先看一下使用&#xff1a; <ng-container *ngComponentOutlet&…

JTable的模型

2018-11-04 23:15:21开始写 模型类 1 import javax.swing.table.DefaultTableModel;//导入包2 3 public class LocalTableModel extends DefaultTableModel {//继承4 Class[] types new Class[] {java.lang.String.class, java.lang.String.class};// 表头的类类型5 b…

体验荣耀手环4Running版,玩出健康!

手环现在已经成为了很多人生活的必备&#xff0c;刚开始接触的时候觉得挺新奇可以看时间查看一些运动数据&#xff0c;但时间长了就感觉不够给力了&#xff0c;主要是对于喜欢运动的我来说&#xff0c;这些手环产品并没有起到太大的作用&#xff0c;之后基本只是当做简单的小手…

智能媒体管理(IMM)文档转换/预览提供 API 按量计费模式

一、导语 智能媒体管理 (Intelligent Media Management, IMM) 是阿里云的云服务&#xff0c;它通过 文档标准型 实例提供了 Cloud Native 架构的文档转换/预览功能 &#xff0c;本文介绍 API 按量计费模式的配置。 二、创建文档标准型按量计费项目 使用 API 按量计费&#xff…

XCode各版本与Mac OS各版本对应列表

Apple公司你不说牛B是不行的&#xff01;人家就是凭借“封闭”式开发与“封闭”式销售&#xff0c;硬是把手机移动市场的一大块牢牢把握住。我还不知道&#xff0c;目前世界上还有哪些IT公司敢向他们挑战。不费话了&#xff0c;现在把XCode各版本与Mac OS各版本对应列表如下&am…

拉格朗日插值和牛顿插值 matlab

1. 已知函数在下列各点的值为 0.2 0.4 0.6 0.8 1.0 0.98 0.92 0.81 0.64 0.38 用插值法对数据进行拟合&#xff0c;要求给出Lagrange插值多项式和Newton插值多项式的表达式&#xff0c;并计算插值多项式在点的值。 程序&#xff1a; x[0.2 0.4 0.6 0.8 1.0]; y[0.98 …

零基础学习hadoop开发先明白这层关系

零基础学习hadoop开发先明白这层关系大数据hadoop无疑是当前互联网领域受关注热度最高的词之一&#xff0c;大数据技术的应用正在潜移默化中对我们的生活和工作产生巨大的改变。这种改变给我们的感觉是“水到渠成”&#xff0c;更为让人惊叹的是大数据已经仅仅是互联网行业的风…

Python-计算机硬件基础

预习计算机硬件基础1&#xff0c;CPU/内存、硬盘2&#xff0c;存储器什么是编程语言什么是编程编程的目的运行程序的三大核心硬件重要&#xff1a;运行程序&#xff0c;硬件的工作过程 -------------------------------------------------------------- 1&#xff0c;语言&…