单例模式浅析

程序中仅存在一个对象实例,避免重复构建浪费资源。

1.饿汉式

主要分为3步:1.构造方法私有化 2.内部创建静态实例化对象 3.提供公有静态方法,返回对象实例

public class SingleTon {
//    构造方法私有化private SingleTon(){}
//    内部创建静态实例化对象private final static SingleTon instance=new SingleTon();
//    提供公有静态方法,返回对象实例public static SingleTon getInstance(){return instance;}
}

缺点:在类加载的时候就会创建内部实例化对象,如果没有使用过这个实例,会造成内存的浪费。

2.懒汉式

只有在调用getInstance()时,才创建实例化对象。

public class SingleTon {
//    构造方法私有化private SingleTon(){}
//    内部创建静态实例化对象private static SingleTon instance;
//    提供公有静态方法,返回对象实例public static  SingleTon getInstance(){if(instance==null){instance=new SingleTon();}return instance;}
}

缺点:存在线程安全问题,可能有多个线程同时进入if判断,构建了多个实例。

3.双重检查

1.实例变量加入volatile关键字,保证多个线程能够看到相同的实例。2.双重检查

public class SingleTon {
//    构造方法私有化private SingleTon(){}
//    内部创建静态实例化对象private static volatile SingleTon instance;
//    提供公有静态方法,返回对象实例public static  SingleTon getInstance(){if(instance==null){synchronized (SingleTon.class){if(instance==null){instance=new SingleTon();}}}return instance;}
}

这样既避免了效率问题(方法上加入synchronized),同时也避免了内存泄漏问题,推荐使用。

4.静态内部类

利用静态内部类的两点特性:1.静态内部类不会在外部类装载时被装载。2.静态内部类只会被装载一次,且不会有线程安全问题。

class SingleTon {//构造器私有化private SingleTon(){}//静态内部类,类中有一个静态属性SingleTonprivate static class SingletonInstance{private static SingleTon instance=new SingleTon();}public static SingleTon getInstance(){return SingletonInstance.instance;}
}

推荐使用。

5.使用枚举

public enum SingleTon3{instance;public void say(){System.out.println("hello");}
}

effective java作者推荐的单例模式实现。

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

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

相关文章

Java字符串常用函数 详解5000字 (刷题向 / 应用向)

1.直接定义字符串 直接定义字符串是指使用双引号表示字符串中的内容,例如"Hello Java"、"Java 编程"等。具体方法是用字符串常量直接初始化一个 String 对象,示例如下: 1. String str"Hello Java"; 或者 …

【C++语法讲解】 | 运算符重构 | 三种运算符的重构方式 |代码演示

文章目录 1,简述2,结构体的定义1,结构体的声明2,结构体的申请 3.1 ,在结构体中重构3.2 在结构体外进行重构 1,简述 通常情况下,我们会创建一些简单的数据结构以应对日常的算法使用,…

npm create vue@latest 原理

文章目录 使用实际调用流程 使用 npm create vitelatest当执行上述命令时,会通过一个可交互的命令行终端下载模版,实际最终是调用 create-vue 库实现的 实际调用流程 npm create、innit 实际是 npm init 别名 ,npm init 后面加包名时,实际…

动态规划笔记+经典习题十道

《算法导论》笔记 (1)动态规划与贪心算法导论 动态规划通常应用于最优化问题,即要做出一组选择以达到一个最优解。在做选择的同时,经常出现同样形式的子问题。当某一特定的子问题可能出自于多于一种选择的集合时,动态…

基于 NGram 分词,优化 Es 搜索逻辑,并深入理解了 matchPhraseQuery 与 termQuery

基于 NGram 分词,优化 Es 搜索逻辑,并深入理解了 matchPhraseQuery 与 termQuery 前言问题描述排查索引库分词(发现问题)如何去解决这个问题?IK 分词器NGram 分词器使用替换 NGram 分词器后进行测试matchPhraseQuery 查…

国际物流常见风险如何规避_箱讯科技

外贸物流是国际贸易的重要环节,其管理和效率的高低直接影响着贸易的成本和效益。因此,外贸企业应该重视物流的组织和管理,提高物流运作的效率。 国际物流基础知识 01什么是“双清包税”和“双清不包税” 双清包税上门又叫双清包税到门&…

CMake引用OSG

从CMake执行find_package(OpenSceneGraph REQUIRED COMPONENTS osgDB osgUtil)这句;情况如下; 当前OSG已经安装好;环境变量添加了OSG_ROOT(其值是OSG安装的根目录),并且 %OSG_ROOT%\bin 添加到了path; 有一个警告,已经done了; Found osgDB: optimized;D:/OSGEarth/l…

wordpress版本识别

wordpress版本识别 1.通过RSS Feed识别 RSS Feed参考 访问网站/feed或者?feedrss 例如 默认结构:https://www.example.com/?feedrss2 其他结构:https://www.example.com/feed/ 返回结果中搜索 generator 可以看到直接是5.9.7版本 2.wpscan等工具扫一…

Powercli批量修改分布式交换机端口组

背景 需求&#xff1a; 批量修改虚拟机的分布式端口组 解决方式一&#xff1a; 三条命令解决&#xff1a;先获取目标虚拟机、获取目标端口组、修改虚拟机端口组、检查虚拟机状态。 $vm Get-VM -Name <虚拟机名称> $portGroup Get-VirtualPortGroup -Name <端口…

生成式人工智能:网络攻击者手中的破坏性力量

2022 年底&#xff0c;公开可用的生成式人工智能工具的推出使我们进入了人类历史上最大的技术革命之一。 一些人声称它的影响与互联网、手机、智能手机和社交媒体的引入一样大&#xff0c;甚至更大。这些新的生成式人工智能技术的采用和发展速度是我们以前从未见过的。 虽然这…

VBA根据Excel内容快速创建PPT

示例需求&#xff1a;根据Excel中选中的单元格内容&#xff08;3列&#xff09;如下图所示&#xff0c;在已打卡的PowerPoint文件中创建页面。 新增PPT Slide页面使用第二个模板页面&#xff0c;其中包含两个文本占位符&#xff0c;和一个图片占位符。将Excel选中区域中前两列写…

学习笔记二十七:K8S控制器Statefulset入门到企业实战应用

这里写目录标题 Statefulset控制器&#xff1a;概念、原理解读Statefulset资源清单文件编写技巧查看定义Statefulset资源需要的字段查看statefulset.spec字段如何定义&#xff1f;查看statefulset的spec.template字段如何定义 Statefulset使用案例&#xff1a;部署web站点State…

【Python基础】Python编程入门自学笔记,基础大全,一篇到底!

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

【华为OD题库-004】阿里巴巴找黄金宝箱1-Java

题目 —贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0-N的箱子&#xff0c;每个箱子上面贴有一个数字&#xff0c;箱子中可能有一个黄金宝箱。 黄金宝箱满足排在它之前的所有箱子数字和等于排在它之后的所有箱子数字…

虚拟机创建与连接的详细步骤

文章目录 什么是虚拟机&#xff1f;步骤1: 选择虚拟化软件1.1 VirtualBox1.2 VMware Workstation1.3 VMware Player1.4 Hyper-V 步骤2: 创建虚拟机2.1 打开虚拟化软件2.2 创建新虚拟机2.3 配置虚拟机2.4 安装操作系统2.5 启动虚拟机 步骤3: 连接虚拟机3.1 图形用户界面 (GUI)3.…

MySQL复习总结(二):进阶篇(索引)

文章目录 一、存储引擎1.1 MySQL体系结构1.2 存储引擎介绍1.3 存储引擎特点1.4 存储引擎选择 二、索引2.1 基本介绍2.2 索引结构2.3 索引分类2.4 索引语法2.5 SQL性能分析2.6 索引使用2.6.1 最左前缀法则2.6.2 范围查询2.6.3 索引失效情况2.6.4 SQL提示2.6.5 覆盖索引2.6.6 前缀…

Python基础入门例程35-NP35 朋友的年龄是否相等(运算符)

最近的博文&#xff1a; Python基础入门例程34-NP34 除法与取模运算&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程33-NP33 乘法与幂运算&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程32-NP32 牛牛的加减器&#xff08;运算符&#xff09;-CSD…

【四、http】go的http的文件下载

一、日常下载图片到本地 //下载文件func downloadfile(url, filename string) {r, err : http.Get(url)if err ! nil {fmt.Println("err", err.Error())}defer r.Body.Close()f, err : os.Create(filename)if err ! nil {fmt.Println("err", err.Error())…

Python开发技能实战-通过配置的代理服务器在具有外网连接的环境中在Pycharm中运行python代码

实现功能 打开科学上网工具&#xff0c;使得能够在浏览器科学上网&#xff0c;通过科学上网工具的配置文件&#xff0c;可以看出本地和远程代理的映射关系&#xff0c;此时&#xff0c;远程地址本地地址&#xff0c;远程端口本地端口。 1、在程序中配置请求网页代理请求。不需…

系统设计中的缓存技术:完整指南

Image.png 缓存是软件工程中用于提高系统性能和用户体验的基本技术。它通过临时存储频繁访问的数据在缓存中&#xff0c;缓存比数据的原始来源更容易访问。 作为一名软件工程师&#xff0c;了解缓存以及它在不同类型的系统中的工作方式是至关重要的。在本文中&#xff0c;我们将…