单例模式(饿汉模型,懒汉模型)

在着里我们先了解什么是单例模式。

就是某个类在进程中只能有单个实例,这里的单例模式需要一定的编程技巧,做出限制,一旦程序写的有问题,创建了多个实例,编程就会报错。

如果我们学会了单例模式,这种模式会提高我们的下限。

其中单例模式包含了两种模型,一种是饿汉模型,另一种是懒汉模型,这里的懒汉模型尤为重要,面试也会考。


饿汉模型


这里的单列就是指一个对象,instance。

如代码:

class Singleton {private static Singleton instance = new Singleton();public static Singleton getInstance(){return instance;}
}

这里我们采用 static 来修饰 instance ,因为当初始化的时候只执行一次。

还有当我们想要获取 instance 变量的时候,直接调用getInstance方法就行了,这样我们不用重新在new了。

上述的代码,是饿汉模型。


懒汉模型


这里的懒汉模型不是在程序创建的时候new,而是第一次使用的时候才去创建,这样就可以节省当不用时,我们不用创建的开销。

如代码:

class SingletonLazy {private static SingletonLazy instance = null;public SingletonLazy getinstance(){if(instance == null){instance = new SingletonLazy();}return instance;}}

如上述代码,我们可以看到,就是调用的时候就用。

那么,如果这样是否会引起线程安全问题呢?

答案会引起线程安全问题。

在这里我们当有两个线程同时运行的时候,其线程1和线程2,同时进入if判定,都为true,此时我们就会出现两个,new了,直接就报错了。

那么这里我们加上锁之后,会不会线程安全了呢?

如代码:

class SingletonLazy {private static SingletonLazy instance = null;public static Object locker = new Object();public SingletonLazy getinstance(){if(instance == null){synchronized (locker){instance = new SingletonLazy();}}return instance;}}

这里加上锁也是不安全的,我们具体分析一下。还是两个线程,当出现这种执行顺序时,

如图:

由图中我们可以知道,这种加锁,仍会 new两个。

在这里我们可以采用双重 if 来解决这种线程安全问题。

如代码:

class SingletonLazy {private static SingletonLazy instance = null;public static Object locker = new Object();public SingletonLazy getinstance(){if(instance == null){synchronized (locker){if(instance == null){instance = new SingletonLazy();}}}return instance;}}

如代码,我们在锁里面再加个 if 就可以避免 两个new了,使线程安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/603927.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fabric入门【00】简介

一、Hyperledger Fabric 1.IBM公司开发的联盟链:必须经过授权认证才能加入(优点:避免了PoW资源开销、提高交易处理速率。缺点:去中心化程度减低) 二、主要组成部分 1.Ledger: (1)…

微机原理——绪论

本篇文章是我在观看网课时记录的笔记。如有错误欢迎批评指正。 微机原理————绪论 我们在使用计算机时,最重要最核心的就是计算机的CPU(中央处理器),决定了计算机的计算速度,但是CPU无法直接读取外界的温度、湿度、压力之类的物理量&…

前端html+css+js常用总结快速入门

🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 学习前端全套所有技术性价比低下且容易忘记,先入门学会所有基础的语法(cssjsheml)&#xff…

用代码验证,esm 导出的是值的引用,commonjs导出的是值的拷贝

首先需要学习一下 esm 和 commonjs 的区别,其中一条关于导出值我们可以手动验证一下,先记住结论 esm 导出的是值的引用commonjs导出的是值的拷贝 没错我又遇到这个问题了,面试官先问我 commonjs 和 esm 有啥区别? 然后问如果 com…

Docker仅需3步搭建免费私有化的AI搜索引擎-FreeAskInternet

简介 FreeAskInternet 是一个完全免费、私有且本地运行的搜索引擎,并使用 LLM 生成答案,无需 GPU。用户可以提出问题,系统会进行多引擎搜索,并将搜索结果合并到ChatGPT3.5 LLM中,并根据搜索结果生成答案。 什么是 Fr…

什么是多路复用器滤波器

本章将更深入地介绍多路复用器滤波器,以及它们如何用于各种应用中。您将了解到多路复用器如何帮助设计人员创造出更复杂的无线产品。 了解多路复用器 多路复用器是一组射频(RF)滤波器,它们组合在一起,但不会彼此加载,可以在输出之…

PostgreSQL入门到实战-第九弹

PostgreSQL入门到实战 PostgreSQL数据过滤(二)官网地址PostgreSQL概述PostgreSQL中and操作理论PostgreSQL中and操作实操更新计划 PostgreSQL数据过滤(二) 了解PostgreSQL AND逻辑运算符以及如何使用它来组合多个布尔表达式。 官网地址 声明: 由于操作系统, 版本更新等原因, …

LeetCode-322. 零钱兑换【广度优先搜索 数组 动态规划】

LeetCode-322. 零钱兑换【广度优先搜索 数组 动态规划】 题目描述:解题思路一:Python动态规划五部曲:定推初遍举【先遍历物品 后遍历背包】解题思路二:Python动态规划五部曲:定推初遍举【先遍历背包 后遍历物品】解题思…

查分约束学习

问题模型&#xff1a; 有n个变量&#xff1a;&#xff0c;有m个约束条件 令差分数组&#xff0c;可以知道如果x1x2<q&#xff0c;那么与j和i-1有关联 由画图可知&#xff0c;如果有在i-1至j建立的有向图中跑最短路&#xff0c;那么dis[n]即为最小的约束变量 另外&#x…

如何在ngc中找到跟物理机驱动版本匹配的docker镜像

如何在ngc中找到跟物理机驱动版本匹配的docker镜像 1.nvidia-smi查看CUDA版本2. [打开ngc官网](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch/layers)3.直到找到CUDA版本对应的Tag【比如CUDA 12.1的tag是 23.07-py3】4.拉取镜像 [Tag&#xff1a;23.07-py3]…

【攻防世界】mfw(.git文件泄露)

首先进入题目环境&#xff0c;检查页面、页面源代码、以及URL&#xff1a; 发现页面无异常。 使用 dirsearch 扫描网站&#xff0c;检查是否存在可访问的文件或者文件泄露&#xff1a; 发现 可访问界面/templates/ 以及 .git文件泄露&#xff0c;故使用 GItHack 来查看泄露的 …

提示词专场:从调整提示改善与LLMs的沟通,到利用LLMs优化提示效果

编者按&#xff1a;欢迎阅读“科研上新”栏目&#xff01;“科研上新”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里&#xff0c;你可以快速浏览研究院的亮点资讯&#xff0c;保持对前沿领域的敏锐嗅觉&#xff0c;同时也能找到先进实用的开源工具。 提示词的好坏决…