Java单例模式的五种实现方式 懒汉式 饿汉式 双重校验锁 静态变量 静态内部类 枚举实现单例模式等

embedded/2024/10/22 8:31:57/

1、什么是单例模式

Java单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它通常用于需要共享资源或控制某些共享状态的情况下。

2、实现方式

懒汉式:在类加载的时候就创建对象,要再调用方法时才创建对象,减少内存开销。
饿汉式:再类加载的时候就实例化对象。

2.1 同步方法调用创建实例(懒汉式)

当刚加载这个类时不会直接初始化person,只有调用getPerson()方法时才会构建唯一实例。

java">public class Person {private static Person person;//将构造器私有化,就无法从外部调用构造器构造对象private Person(){}//此时这个synchronized是保证线程安全public synchronized static Person getPerson() {if (person == null) {person = new Person();}return person;}
}

2.1 双重校验锁方式加载对象实例(懒汉式)

用两个判断,在第一个判断不通过时,我们不用同步代码块,直接返回结果

java">public class Person {//此时要用volatile用于保证person = new Person()内部指令不排序private volatile static Person person;//将构造器私有化,就无法从外部调用构造器构造对象private Person(){}public  static Person getPerson() {if (person ==null){synchronized (Person.class){if (person == null){person = new Person();}}}return person;}
}

2.1 静态变量加载对象实例(饿汉式)

对象唯一实例会随着这个类的加载就会被初始化出来,基于 classloader 机制避免了多线程的同步问题,但它再还没有使用这个对象时就被加载出来,有点浪费内存空间。

java">public class Person {private static Person person = new Person();//将构造器私有化,就无法从外部调用构造器构造对象private Person(){}public  static Person getPerson() {return person;}
}

2.1 静态内部类实现单例模式(懒汉式)

这里用到了一个知识点,就是内部类不会随着外部类的加载而加载,而是再第一次使用到内部类后再加载初始化内部类。这样的机制实现了懒汉模式。我们使用了final修饰,也将其确定为单例模式

java">public class Person {private static class PersonHolder {private static final Person INSTANCE = new Person();}
//将构造器私有化,就无法从外部调用构造器构造对象private Person (){}public static final Person getInstance() {return PersonHolder.INSTANCE;}
}

2.1 枚举实现单例模式(饿汉式)

这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。

java">public enum Singleton {  INSTANCE;  public void whateverMethod() {  }  
}

完整的枚举单例

java">
public class User {//私有化构造函数private User(){ }//定义一个静态枚举类static enum SingletonEnum{//创建一个枚举对象,该对象天生为单例INSTANCE;private User user;//私有化枚举的构造函数private SingletonEnum(){user=new User();}public User getInstnce(){return user;}}//对外暴露一个获取User对象的静态方法public static User getInstance(){return SingletonEnum.INSTANCE.getInstnce();}
}public class Test {public static void main(String [] args){System.out.println(User.getInstance());System.out.println(User.getInstance());System.out.println(User.getInstance()==User.getInstance());}
}
结果为true

http://www.ppmy.cn/embedded/10683.html

相关文章

js 处理时间一些函数

对于前端来说 关于 时间的各种 转换是是经常遇到的问题。今天记录下,省的来回查。耽误时间。有需要的可以借鉴下。 这是在vue2 项目下 用到的。需要安装 moment 我安装的是 "moment": "^2.29.4", npm install momentimport moment from mome…

【Linux系统编程】第七弹---权限管理操作(上)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、修改文件权限的做法(一) 2、有无权限的表现 总结 上一弹我们讲解了Linux权限概念相关的知识,但是我们只知道有…

Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案

原文首发链接:Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案 大家好,我是码农先森。 引言 这次实现音视频实时通信的方案是基于 WebRTC 技术的,它是一种点对点的通信技术,通过浏览器之间建立对等连接,实现音频…

【C++风云录】粒子魔法大全:打造惊艳视觉效果的工具和引擎

从闪光到爆炸:深入了解粒子系统和特效工具 前言 本文将介绍多种用于创建粒子系统和特效的软件开发工具和引擎。这些工具涵盖了从基础到高级的应用,有助于开发人员实现各种视觉效果。 欢迎订阅专栏:C风云录 文章目录 从闪光到爆炸&#xff…

嵌入式系统相关知识总结

一、概述 嵌入式系统是以应用为中心、以计算机技术为基础,并将可配置与可裁剪的软、硬件集成与一体的专用计算机系统,需要满足应用对功能、可靠性、成本、提及和功耗等方面的严格要求。 从计算机角度看,嵌入式系统是指嵌入各种设备及应用产品…

SpringBoot集成RabbitMQ

RabbitMQ详细说及作用 RabbitMq的简介 RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。RabbitMQ是…

STM32H750外设ADC之MCU内部温度传感器

目录 概述 1. 内部温度传感器 1.1 功能介绍 1.2 读取温度方法 1.3 计算温度值 2 STM32Cube生成工程 2.1 配置参数 2.2 生成工程文件 3 功能实现 3.1 初始化ADC 3.2 功能函数 4 测试 代码下载地址: stm32-h750-proj-ADC-Read-temp资源-CSDN文库 概述…

FPGA ——Verilog语法示例

FPGA ——Verilog语法示例 多模块定义条件判断 多模块定义 genvar i ;generatefor (i0 ; i<8; ii1)beginxdc xdc_u(.d1 (d1 ) ,.d2 (d2 ) ,.d3 (d3 ));end endgenerate条件判断 generate beginif(DEBUG "ON")beginila ila_u(.clk(clk),.probe0({A1,A2,A3,A4}))…