单例模式的线程安全形式

news/2024/11/28 7:37:27/

目录

1.单例设计模式的概念

2.实现方法:

1.饿汉式

2.懒汉式

3.区分饿汉式和懒汉式:

3.单例模式的双重校验线程安全形式

1.线程安全问题的解决方法

1.1 synchronized关键字:

1.2 volatile关键字:

        保证变量可见性(不保证原子性)

        禁止指令的重排序

2.线程安全的单例模式的代码实现

PS.什么是指令的重排序


1.单例设计模式的概念

        单例:只能存在一个对象实例

        设计模式:大量实践中总结和理论化后优选的代码结构编码风格。就像是一些固定套路

2.实现方法:

1.饿汉式

        1.私有化类的构造器

        2.内部创建类的私有静态对象

        3.提供类的对象的静态get方法

#饿汉式
public class singleTonHungry {//1.私有化类的构造器private singleTonHungry(){}//2.内部创建类的对象private static singleTonHungry singleTonHungry = new singleTonHungry();//3.提供静态方法返回private static singleTonHungry getSingleTonHungry(){return singleTonHungry;}}

2.懒汉式

        1.私有化类的构造器

        2.声明当前类的对象:null

        3.声明一个public、static的方法返回当前类对象的方法

#懒汉式
public class singleTonLazy {//1.私有化类的构造器private singleTonLazy(){}//2.创建对象私有化private static singleTonLazy singleTonInstance;//3.静态方法返回public static singleTonLazy getInstance(){if (null == singleTonInstance){singleTonInstance = new singleTonLazy();}return singleTonInstance;}}

3.区分饿汉式和懒汉式:

        1.懒汉式:好处:延迟对象创建

                          坏处:线程不安全,到多线程内容时,再修改。

        2.饿汉式: 好处:是线程安全的

                          坏处:对象在内存中加载时间过长
 

3.单例模式的双重校验线程安全形式

1.线程安全问题的解决方法

1.1 synchronized关键字:

        synchronized译为:使同步

        synchronized(同步监视器){需要被同步代码}

        同步监视器,俗称锁;任何类的对象都可以充当锁;

1.2 volatile关键字:

        volatile译为:不稳定的

        保证变量可见性(不保证原子性)

                使用volatile修饰的变量,是共享且不稳定的,使用时从主存中读取改变量

        禁止指令的重排序

                在对volatile修饰的变量进行读写操作时,能够防止JVM指令重排序

2.线程安全的单例模式的代码实现

public class singleTon{private singleTon(){}//为实例加上volatile关键字private volatile static singleTon singleTonInstance;public static singleTon getSingleTonInstance(){if(null == singleTonInstance){//加上synchronize锁synchronized(singleTon.class){singleTonInstance = new singleTon();}}return singleTonInstance;    }
}

PS.什么是指令的重排序

2.1 指令

        计算机执行操作的命令,比如算术运算指令、程序流程控制指令、处理器控制指令

2.2 重排序

        CPU为了最大性能利用率,只要能够保证程序最终结果和顺序化执行下结果相等,就可以更改指令执行顺序

指令的排序与代码的关系,比如:

int i = 8080;

这行代码需要执行两条指令:

        加载常量8080

        将8080赋值给变量i


http://www.ppmy.cn/news/979234.html

相关文章

DDD架构

原文 一、DDD层级 DDD架构层级为四层:用户接口层,应用层,领域层,基础层 1. 用户接口层 Interfaces 的代码目录结构有:assembler、dto 和 facade 三类 Assembler: 实现 DTO 与领域对象之间的相互转换和数…

【docker 安装】 与【docker-compose 安装】

不同的操作系统需要不同的docker安装文件:具体下载位置: Docker: https://download.docker.com/linux/static/stable/ docekr-compose:https://github.com/docker/compose/releases 1. 验证客户机器是否有docker 和docker-compose docker -…

Vue源码学习 - 数据响应式原理

目录 前言一、入口查找二、初始化initState()initProps()initData()observe() - Observer的守护ObserverdefineReactive() 三、依赖收集Watcher 和 Dep 通过 例子 对概念有个了解1)什么是Watcher呢?2)Watcher的种类有哪些呢?3&…

【linux】uboot之链接重定向

文章目录 一、uboot中的链接脚本重定向二、具体代码编译器选项uboot中的符号重定向 一、uboot中的链接脚本重定向 在 U-Boot 中,链接脚本(Linker Script)用于指定可执行文件的内存布局和符号表等信息。通过修改链接脚本,可以对程…

于大模型迁移中学习 Docker

最近在做大模型的昇腾迁移,国产化框架踩坑不少,基本一天的工作量相当于之前做纯视觉算法时一周踩过的坑数了。 现在在modelarts上用八卡昇腾910跑llama,不同于之前自己配环境,昇腾生态创新中心都是用的镜像,虽说打包起…

Shell编程基础(三)环境变量 位置变量 系统内置变量

环境变量 & 环境变量环境变量范围父子进程之间有效指定用户有效所有用户有效 位置变量系统内置变量 环境变量 在脚本种直接定义的变量,只能在当前shell进程中使用 若想要在其他shell进程中使用,可以将变量声明为 环境变量 export 变量名 &#xff…

问题解决Can‘t update table ‘category‘ in store

问题描述: 使用spring boot的时,候访问更新数据库内容接口报错: Error updating database. Cause: java.sql.SQLException: Cant update table category in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 问题…

夯实数字化转型安全地基,华东某农商行开源安全治理经验

华东某农村商业银行是一家全国首批组建的股份制农村金融机构。近年来,该农商行坚持“科技强行”战略,进一步夯实数字化核心基础,积极推动金融科技与产品、服务的深度融合,努力拓展数字金融的包容性,让数字金融更有温度…