java的单例设计模式

1什么是单例设计模式:

所谓类得单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法;

2.单例模式有两种方式:

2.1饿汉式

如何实现:

①构造器私有化=>防止用户直接去new。

②类得内部创建对象

③向外暴露一个静态的公共方法,getInstance

④代码实现

public class Singleton {// 在类加载时就创建实例//为了在静态方法中使用,需要将其修饰为static;private static Singleton instance = new Singleton();// 私有构造方法,防止外部类直接实例化private Singleton() {}// 静态方法返回实例public static Singleton getInstance() {return instance;}
}

在这个例子中,Singleton类的构造方法被声明为私有,外部类无法直接实例化该类。在类加载时,静态变量instance被初始化为一个Singleton的实例,因此在整个程序运行期间,只会创建一个Singleton对象。

通过getInstance()方法,可以获取到该实例。由于在类加载时就已经创建了实例,因此无需考虑线程安全问题。

使用饿汉式实现的单例模式具有以下特点:

  • 线程安全:由于在类加载时就创建了实例,因此不存在多线程并发访问的问题。

  • 简单直接:实现简单,无需考虑线程同步和延迟初始化的问题。

  • 可能造成资源浪费:由于在类加载时就创建了实例,如果该实例在程序运行期间很少被使用,可能会造成资源的浪费。

需要注意的是,饿汉式的单例模式适用于单线程环境或者对资源使用效率要求较高的情况。在多线程环境下,如果多个线程同时调用getInstance()方法,可能会导致实例被创建多次,因此需要考虑线程安全问题。

2.2懒汉式

实现步骤:

①构造器私有化;

②定义一个静态属性对象;

③提供一个public的static方法,可以返回一个Cat对象;

public class Singleton {// 延迟初始化,使用volatile关键字保证可见性private static volatile Singleton instance;// 私有构造方法,防止外部类直接实例化private Singleton() {}// 静态方法返回实例public static Singleton getInstance() {// 双重检查锁定,确保只有第一次调用时才会创建实例if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

在这个例子中,Singleton类的构造方法被声明为私有,外部类无法直接实例化该类。在第一次调用getInstance()方法时,会进行双重检查锁定,确保只有第一次调用时才会创建实例。使用volatile关键字修饰instance变量,保证在多线程环境下的可见性。

懒汉式的单例模式具有以下特点:

  • 延迟初始化:只有在第一次调用getInstance()方法时才会创建实例,可以节省资源。

  •  线程安全:通过双重检查锁定,确保在多线程环境下只会创建一个实例。

  • 复杂性较高:相比饿汉式,懒汉式的实现较为复杂,需要考虑线程同步和延迟初始化的问题。

需要注意的是,懒汉式的单例模式在多线程环境下需要考虑线程安全问题。通过双重检查锁定可以解决线程安全问题,但在某些情况下可能会出现双重检查锁定失效的问题,因此需要谨慎使用。

3.两者的区别:

①两者最主要的区别,在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时才创建;

②饿汉式不存在线程安全问题,而懒汉式存在;

③饿汉式存在资源浪费的问题,如果一个程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,而懒汉式不存在;

④javase标准类中,java.lang.Runtime就是经典的单例模式;

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

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

相关文章

【SparkML系列3】特征提取器TF-IDF、Word2Vec和CountVectorizer

本节介绍了用于处理特征的算法,大致可以分为以下几组: 提取(Extraction):从“原始”数据中提取特征。转换(Transformation):缩放、转换或修改特征。选择(Selection&…

15.Golang中的反射机制及应用

目录 概述实践基本应用复杂应用 结束 概述 Golang中的反射用法还是比较简单的 reflect.TypeOf(arg)reflect.ValueOf(arg) 实践 基本应用 package mainimport ("fmt""reflect" )func reflectNum(arg interface{}) {fmt.Println("type ", re…

网络异常案例三_RST

问题现象 在做功能测试的时候,经常看到设备离线的消息(MQTT遗嘱)。 在终端连接的网络设备上抓包分析,看到终端设备发起大量的RST请求。 151这个设备,7min,重置断开了8个TCP连接(mqtt连接&#…

Fiber

在React中,Fiber是一个核心架构,它是React 16及后续版本中用于处理和调度组件更新的一种机制。React Fiber的核心目的是改进React对复杂应用状态更新的处理方式,特别是为了更好地支持如动画、布局偏移等高性能需求场景,同时提供了…

理解部署描述符的元素

理解部署描述符的元素 部署描述符是文件名为web.xml的XML文件,其包含了Web应用程序的配置信息。每个Web应用程序都有一个web.xml文件。web.xml文件的元素可用于指定servlet的初始化参数、不同文件的MIME类型、侦听器类,以及将URL模式映射到servlet上。一…

2024年,AI 掀起数据与分析市场的新风暴

2024 年伊始,Kyligence 联合创始人兼 CEO 韩卿在其公司内部的飞书订阅号发表了多篇 Rethink Data & Analytics 的内部信,分享了对数据与分析行业的一些战略思考,尤其是 AI 带来的各种变化和革命,是如何深刻地影响这个行业乃至…

vue中nextTick()

在 Vue.js 中&#xff0c;nextTick() 是一个非常有用的方法&#xff0c;用于在下一个 DOM 更新循环结束后执行延迟回调。这在你需要读取或写入刚刚更新的 DOM 时非常有用。 下面是一个简单的示例代码&#xff0c;用于解析 nextTick() 的用法&#xff1a; <template> &…

防御挂马攻击:从防御到清除的最佳实践

挂马攻击&#xff0c;也称为马式攻击&#xff08;Horse Attack&#xff09;&#xff0c;是一种常见的网络攻击手段。攻击者通过在目标服务器或网站中植入恶意程序&#xff0c;以获取系统权限或窃取敏感信息。为了应对这种威胁&#xff0c;本文将重点介绍防御挂马攻击的最佳实践…

【SparkML系列1】相关性、卡方检验和概述器实现

Correlation(相关性) 计算两组数据之间的相关性在统计学中是一种常见的操作。在spark.ml中&#xff0c;我们提供了计算多组数据之间成对相关性的灵活性。目前支持的相关性方法是皮尔逊&#xff08;Pearson&#xff09;相关系数和斯皮尔曼&#xff08;Spearman&#xff09;相关…

VTK 交互事件

学习笔记&#xff1a;VTK 交互事件 1. 定义 VTK&#xff08;Visualization Toolkit&#xff09;中的交互事件是与用户交互操作相关的事件&#xff0c;例如鼠标移动、按键按下、小部件交互等。这些事件允许程序捕捉用户的输入&#xff0c;从而实现交互式的可视化体验。 2. 参…

AI项目落地成功因素:数据和机器学习模型的选择

构建机器学习模型时&#xff0c;需要考虑几个关键要素&#xff1a;计算能力、算法和数据。公司往往会将大部分资源集中于开发正确的、无偏见的算法&#xff0c;并加大对计算能力的投入&#xff0c;而在运行模型前&#xff0c;数据通常靠边站或完全被抛诸脑后。 如果数据被遗忘&…

消息中间件(MQ)对比:RabbitMQ、Kafka、ActiveMQ 和 RocketMQ

前言 在构建分布式系统时&#xff0c;选择适合的消息中间件是至关重要的决策。RabbitMQ、Kafka、ActiveMQ 和 RocketMQ 是当前流行的消息中间件之一&#xff0c;它们各自具有独特的特点和适用场景。本文将对这四种消息中间件进行综合比较&#xff0c;帮助您在项目中作出明智的…

C语言——动态内存管理(经典例题)

题1、 为什么会崩溃呢&#xff1f;&#x1f914;&#x1f914;&#x1f914; #include <stdio.h> #include <stdlib.h> #include <string.h>void GetMemory(char** p) {*p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(&str);str…

SQL DISTINCT 用法总结

SQL DISTINCT 用法总结 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;今天我们将深入研究 SQL 中的 DISTINCT 关键字。DISTINCT 是一项非常有用的功能&#xff0c;用于从查询结果中消除重复的行&#xff0c;让我们一起学习其基本…

QT 组装json,广播发送

QUdpSocket *udpSocket; udpSocket new QUdpSocket(); //创建一个QUdpSocket QByteArray byteArray; QJsonObject rectJson; rectJson.insert("NW1", NW1); rectJson.insert("NW2", NW2); rectJson.insert("NW3", NW3); rectJson.insert(&quo…

正常注册会报组件未注册

// 生命周期中临时注册一下&#xff08;正常注册会报组件未注册&#xff09; beforeCreate() {this.$options.components.FirstRegistration require(/pages/peanut/components/modules/firstRegistration.vue).default },

java中如何使用Lambda表达式(九)

Java中常用的函数式接口有哪些 在Java中&#xff0c;常用的函数式接口有一些是在java.util.function包中预定义的。这些接口主要用于支持Lambda表达式和函数式编程&#xff0c;使得在Java中可以更方便地使用函数式接口。以下是一些常用的函数式接口&#xff1a; Function<T…

腾讯云幻兽帕鲁Palworld服务器价格表,2024年2月最新

腾讯云幻兽帕鲁服务器价格32元起&#xff0c;4核16G12M配置32元1个月、96元3个月、156元6个月、312元一年&#xff0c;支持4-8个玩家&#xff1b;8核32G22M幻兽帕鲁服务器115元1个月、345元3个月&#xff0c;支持10到20人在线开黑。腾讯云百科txybk.com分享更多4核8G12M、16核6…

力扣hot100 不同路径 多维DP 滚动数组 数论

Problem: 62. 不同路径 文章目录 思路解题方法复杂度朴素DP 思路 讲述看到这一题的思路 解题方法 &#x1f468;‍&#x1f3eb; 卡尔一题三解 复杂度 时间复杂度: &#xff1a; O ( n m ) O(nm) O(nm) 空间复杂度: O ( n m ) O(nm) O(nm) 朴素DP class Solution {p…

查看 npm的一些命令,以及npm config set registry x x x 不生效 解决方案

在 Mac 上查看自己的 npm 源&#xff0c;可以使用以下命令&#xff1a; 打开终端应用程序&#xff08;Terminal&#xff09;。 运行以下命令来查看当前的 npm 配置&#xff1a; npm config list这会显示 npm 的配置信息&#xff0c;包括当前使用的源&#xff08;registry&am…