单例模式---JAVA

目录

“饿汉”模式

完整代码

“懒汉”模式

完整代码


单例模式:保证某个类在程序中只存在唯一一份实例, 而不会创建出多个实例。

单例模式可以通过实例创建的时间来分为两种:“饿汉”和“懒汉”模式。

“饿汉”模式

所谓的“饿汉”模式实则就是在类加载的时候创建出实例。

首先我们先创建一个类Singleton再在类中写一个静态私有的常量,而这个常量的值就是唯一对象的引用。

class Singleton{private static final Singleton singleton = new Singleton();
}

因为这个唯一对象是私有的所以还需要一个get方法。

public static Singleton getSingleton() {return singleton;
}

可是现在我们从别的地方还是可以直接new出这个类的其它实例,这个该怎么解决呢?我们只需要再写一个私有的构造方法就可以解决了。

private Singleton() {}

这就是一个简单的单例模式了(“饿汉”模式)

完整代码

class Singleton{private static final Singleton singleton = new Singleton();public static Singleton getSingleton() {return singleton;}private Singleton() {}
}

但是由于“饿汉”模式的实例是在类加载时就创建了,并没有考虑这个实例在代码中是否使用,这就有可能会导致代码中并没有用这个类可是你却已经创建了,这就会导致内存浪费,解决办法就是“懒汉”模式。

“懒汉”模式

“懒汉”模式是在线程的一次调用该类的get方法时进行唯一实例的创建。

先创建一个类,该类中有一个私有的类属性,该属性的值为null或唯一实例的引用。 

class Singleton{private static Singleton singleton = null;
}

为了保证实例的唯一性,将构造方法写为私有的。

private Singleton() {}

写一个get方法,该方法在第一次被调用时会创建出一个唯一实例。

public static Singleton getSingleton() {if (singleton == null) {singleton = new Singleton();}return singleton;
}

这个get方法在单线程中看是没有任何问题的,但是如果放在多线程代码中就会出现线程安全问题,例如如果出现以下的执行顺序那么就不是单例模式了。

解决办法就是加锁

public static Singleton getSingleton() {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}return singleton;
}

但是此时代码又面临了一个效率问题,由于我们只有第一次调用get时才会创建实例才会出现线程安全问题,可是现在我们每次调用get方法都会进行加锁操作,而加锁就会有锁竞争从而导致代码效率过低的问题,解决方法就是再加一层 if 判断。

public static Singleton getSingleton() {if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}}return singleton;
}

因为new操作很有可能触发指令重排序,所以为了防止编译器对其进行优化建议加上volatile

 

private static volatile Singleton singleton = null;

完整代码

class Singleton{private static volatile Singleton singleton = null;private Singleton() {}public static Singleton getSingleton() {if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}}return singleton;}
}

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

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

相关文章

用红葡萄酿造的白葡萄酒是怎样的?

“由黑变白”这是“黑葡萄”的直译,代表一种由深蓝到黑葡萄制成的白葡萄酒,这种酿酒方式起源于法国,黑皮诺和莫尼尔的红葡萄一直被加工成白葡萄酒,作为香槟的基础。这是可能的,因为红色浆果通常果肉较轻。红色素&#…

表分区管理

案例:--表分区-列表分区 --根据客户的省份分区,保存不通省份客户到不同的分区 CREATE table clients( id INTEGER primary key, name VARCHAR2(20), province VARCHAR2(20)) partition by list(province) ( partition shandong VALUES(山东省), …

【langchain】入门初探实战笔记(Chain, Retrieve, Memory, Agent)

1. 简介 1.1 大语言模型技术栈 大语言模型技术栈由四个主要部分组成: 数据预处理流程(data preprocessing pipeline)嵌入端点(embeddings endpoint )向量存储(vector store)LLM 终端&#xff…

*4.3 CUDA MEMORY TYPES

CUDA设备包含几种类型的内存,可以帮助程序员提高计算到全局内存的访问率,从而实现高执行速度。图4.6显示了这些CUDA设备内存。全局内存和恒定内存出现在图片的底部。主机可以通过调用API函数来写入(W)和读取(R&#xf…

Hadoop集群环境下HDFS实践编程过滤出所有后缀名不为“.abc”的文件时运行报错:java.net.ConnectException: 拒绝连接;

一、问题描述 搭建完Hadoop集群后,在Hadoop集群环境下运行HDFS实践编程使用Eclipse开发调试HDFS Java程序(文末有源码): 假设在目录“hdfs://localhost:9000/user/hadoop”下面有几个文件,分别是file1.txt、file2.tx…

python+playwright 学习-1.环境准备与快速开始

前言 说到 web 自动化,大家最熟悉的就是 selenium 了,selenium 之后又出现了三个强势的框架Puppeteer、CyPress、TestCafe, 但这3个都需要掌握 JavaScript 语言,所以只是少部分人在用。 2020年微软开源一个 UI 自动化测试工具 P…

【前端设计】文字聚光灯

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 案例 文字聚光灯效果可以用于网站标题 html <!DOCTYPE html> <html lang"en&quo…

书生·浦语第二次作业

我最近在参加书生浦语大模型实战营&#xff0c;这是第二次作业打卡&#xff01; 如果你也想两周玩转大模型微调&#xff0c;部署与测评全链路。报名链接&#xff1a;invite 书生浦语大模型实战营报名 邀请码可以填026014 1. 基础作业&#xff08;一&#xff09;&#xff1a;…

什么是检索增强生成 (RAG)

什么是 RAG RAG&#xff0c;即检索增强生成&#xff0c;是一种将预训练的大型语言模型的功能与外部数据源相结合的技术。这种方法将 GPT-3 或 GPT-4 等 LLM 的生成能力与专用数据搜索机制的精确性相结合&#xff0c;从而形成一个可以提供细微响应的系统。 本文更详细地探讨了…

QTDAY1

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> #include <QLabel> #include <QMovie> #include <QLineEdit> #include <QPushButton> class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *p…

探寻智能酒精壁炉在人类文化传承和精神需求中的重要意义

真火壁炉在人类文明中扮演着至关重要的角色&#xff0c;它不仅是温暖与照明的来源&#xff0c;更承载着人类的情感、记忆和文化传承。从古至今&#xff0c;真火壁炉一直都是家庭和社区聚集的焦点&#xff0c;象征着温暖、交流与家庭团聚。并且随着科技的进步&#xff0c;能使用…

SkyWalking介绍和Docker环境下部署

一、Skywalking概述 1、Skywalking介绍 Skywalking是分布式系统的应用程序性能监视工具&#xff0c;专为微服务&#xff0c;云原生架构和基于容器&#xff08;Docker&#xff0c;K8S,Mesos&#xff09;架构而设计&#xff0c;它是一款优秀的APM&#xff08;Application Perfo…

Halcon灰度的平均值和偏差intensity

Halcon灰度的平均值和偏差 intensity 算子用于计算单张图像上多个区域的灰度值的平均值和偏差。该算子的原型如下&#xff1a; intensity (Regions, Image ::: Mean, Deviation )其各参数的含义如下。 参数1&#xff1a;Regions&#xff08;输入参数&#xff09;&#xff0c;…

harmonyOS 时间选择组件(TimePicker)

本文 我们来说 TimePicker 时间组件 首先 我们搭一个最基本的组件骨架 Entry Component struct Index {build() {Row() {Column() {}.width(100%)}.height(100%)} }然后 在 Column 组件内 放一个 TimePicker进去 这里 我们就可以看到 一个时间的选择器了 DatePicker 捕获当前…

孪生神经网络MATLAB实战[含源码]

​一、算法原理 孪生神经网络&#xff08; Siamese neural network&#xff09;是一种深度学习网络&#xff0c;它使用两个或多个具有相同架构、共享相同参数和权重的相同子网。孪生网络通常用于寻找两个可比较事物之间的关系的任务。孪生网络的一些常见应用包括面部识别、签名…

node.js+mysql旅游景点分享网站-计算机毕业设计源码03796

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。旅游景点分享网站设计&#xff0c;主要的模块包括查看后台首页、轮播图&#xff08;轮播图管理&#xff09;、网站公告管理&#xff08;网站公告…

AQS 抽象队列同步器

AQS AQS &#xff08;抽象队列同步器&#xff09;&#xff1a; AbstractQueuedSynchronizer 是什么 来自jdk1.5&#xff0c;是用来实现锁或者其他同步器组件的公共基础部分的抽象实现&#xff0c;是重量级基础框架以及JUC的基石&#xff0c;主要用于解决锁分配给谁的问题整体…

Linux第17步_安装SSH服务

secure shell protocol简称SSH。 目的&#xff1a;在进行数据传输之前&#xff0c;SSH先对联级数据包通过加密技术进行加密处理&#xff0c;然后再进行数据传输&#xff0c;确保数据传输安全。 1、在安装前&#xff0c;要检查虚拟机可以上网&#xff0c;否则可能会导致安装失…

电商带货品牌直播间SOP运营执行步骤

【干货资料持续更新&#xff0c;以防走丢】 电商带货品牌直播间SOP运营执行步骤 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 直播运营模板合集&#xff08;完整资料包含以下内容&#xff09; 目录 直播业务商业框架.png直播工作流程SOP梳理.xlsx 2023年抖…

HubSpot的内容管理系统(CMS)好用吗?

HubSpot的内容管理系统&#xff08;CMS&#xff09;通常被认为是功能强大且用户友好的工具&#xff0c;尤其适用于数字营销和在线业务。以下是一些HubSpot CMS的优势和功能&#xff1a; 用户友好的编辑界面&#xff1a; HubSpot CMS提供直观的编辑界面&#xff0c;具有拖放式编…