【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列

目录

1、单例模式

1.1、饿汉模式

2.1、懒汉模式 

2、阻塞队列

2.1、BlockingQueue 阻塞队列数据结构



1、单例模式

对框架和设计模式的简单理解就是,这两者都是“大佬”设计出来的,让即使是一个代码写的不太好的“菜鸡程序员”也能写出还可以的代码。设计模式也可以认为是对编程语言语法的补充此处提到的“单例模式”就是一种设计模式。

框架(硬性的规定)

设计模式(软性的规定)遵循设计模式,代码的下限就被兜住了,类似下棋时的“棋谱”。

单例,顾名思义,单个实例(对象)。某个类,在一个进程中,只应该创建出一个实例(原则上不应该有多个)。使用单例模式,就可以对代码进行一个更严格的校验和检查。

1.1、饿汉模式

饿汉模式的“创建时机”非常早,实例在类加载的时候就被创建了,相当于程序一启动实例就创建了。因此使用“饿汉”来形容实例创建的迫切,非常早。【并且由于只涉及到读操作,天然的线程安全。】

package thread;// 期望这个类只能有唯一的实例 (一个进程中)
class Singleton {private static Singleton instance = new Singleton();//static修饰的类对象,只存在一个public static Singleton getInstance() {   //只提供一个方法获取静态(类属性)实例return instance;   //只涉及到读操作,天然的线程安全}private Singleton() {}   //使用private修饰构造方法,使得无法使用new创建实例
}public class ThreadDemo26 {public static void main(String[] args) {// Singleton s = new Singleton();   //无法newSingleton s = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s == s2);   //true}
}

在代码中,使用static修饰了一个类对象,然后提供一个方法来获得这个对象,再使用 private 修饰构造方法,使得无法通过 new 创建实例。,由于该实例使用了 static 修饰,在类加载时就已经存在,所以就是懒汉模式。

2.1、懒汉模式 

懒汉模式的实例创建时机相比于饿汉模式要更晚,直到第一次使用的时候,才会创建实例。相比“饿汉模式”,“懒汉模式”效率更高。

 举个例子:

有一个编辑器想要打开一个10GB的文件,如果按照“饿汉”的方式,编辑器就会先把10GB的数据都加载到内存中,然后再进行统一展示;

如果按照“懒汉”的方式,编辑器就会只读取一小部分数据(比如只读10KB),把10KB先展示出来,随着用户进行翻页等操作,再继续读取后续的数据。

package thread;// 懒汉的方式实现单例模式.
class SingletonLazy {// 这个引用指向唯一实例. 这个引用先初始化为 null, 而不是立即创建实例private volatile static SingletonLazy instance = null;   //volatile禁止重排序private static Object locker = new Object();public static SingletonLazy getInstance() {  //将创建实例的操作放到了getInstance里if (instance == null) {   //【注意理解此处的两个if】synchronized (locker) {    //考虑线程安全,需要加锁if (instance == null) {   //【注意理解此处的两个if】instance = new SingletonLazy();}}}return instance;}private SingletonLazy() { }
}public class ThreadDemo27 {public static void main(String[] args) {SingletonLazy s1 = SingletonLazy.getInstance();SingletonLazy s2 = SingletonLazy.getInstance();System.out.println(s1 == s2);   //true}
}

如果 Instance 为 null, 就说明是首次调用, 首次调用就需要考虑线程安全问题, 就要加锁。

如果非 null, 就说明是后续的调用, 就不必加锁了。


讲解第10行和第12行的 if 语句:(双重校验锁)

这样相同且连续的 if 代码从来没写过,这是因为之前写的代码都是在单线程却无阻塞的情况,这种情况下连续两个相同的 if 是无意义的;

但是涉及到阻塞以及多线程的情况,这样的代码就非常的有意义了。看上去是两个一样的条件,实际上这两个条件的结果可能是相反的。

第一个 if 判定的是是否要加锁,如果不是首次调用时就跳过加锁环节,因为此时已经有对象了不需要再创建对象,直接返回即可。

第二个 if 判定的是是否要创建对象


讲解第6行:(volatile 禁止代码重排序)

讲解第13行:(此处的new 操作又可拆成三个大的步骤,而这三个步骤可能会发生代码重排序。比如步骤1 2 3 =》 1 3 2 ,为了防止这种情况,使用了 volatile)

1、申请一段内存空间

2、在这个内存上调用构造方法,创建出这个实例

3、把这个内存地址赋值给 Instance 引用变量

2、阻塞队列

阻塞队列(BlockingQueue),顾名思义,就是一个队列。阻塞队列是基于普通队列做出的扩展。

基于阻塞队列实现的服务器程序叫消息队列(message queue,mq)

阻塞队列的特点有以下两点:

1、线程安全

2、具有阻塞特性

a)如果针对一个已经满了的队列进行入队列,此时入队列操作就会阻塞,一直阻塞到队列不满(其他线程出队列元素)之后。

b)如果针对一个已经空了的队列进行出队列,此时出队列操作就会阻塞,一直阻塞到队列不空(其他线程入队列元素)之后。

 基于阻塞队列,就可以实现“生产者消费者模型”。

1、生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题

2、削峰填谷,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。【类似于现实中三峡大坝所承担的作用】

 类似于擀饺子皮和包饺子的过程,擀饺子皮的线程就是生产者,包饺子的线程是消费者,饺子皮擀好之后放到桌子上,包饺子的线程在从桌子上拿饺子皮包饺子。这里的桌子就是起到了“阻塞队列”的效果,由于桌子的存在,擀饺子皮的线程擀的速度快时,可以把多的饺子皮放到桌子上先(而不需要直接递给包饺子的线程)。

2.1、BlockingQueue 阻塞队列数据结构

Java标准库中提供了现成的阻塞队列数据结构 BlockingQueue,另外还有 ArrayBlockingQueue,LinkedBlockingQueue,PriorityBlockingQueue

package thread;import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class ThreadDemo28 {public static void main(String[] args) throws InterruptedException {BlockingQueue<String> queue = new ArrayBlockingQueue<>(100);queue.put("aaa");String elem = queue.take();System.out.println("elem = " + elem);elem = queue.take();   //进入阻塞状态System.out.println("elem = " + elem);}
}

注意:此处的阻塞队列,入队出队操作不再是以前的 offer 和 poll 方法,而是使用带有阻塞功能put 和 take 方法。

【网络原理】TCP 协议中比较重要的一些特性(二)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136579333?spm=1001.2014.3001.5501【网络原理】TCP 协议中比较重要的一些特性(一)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136366463?spm=1001.2014.3001.5501JVM 的垃圾回收机制以及垃圾回收算法的详解-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136530845?spm=1001.2014.3001.5501

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

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

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

相关文章

全球化服务能力,助力企业拓展海外市场,仓储物流行业解决方案

随着全球化的加速推进&#xff0c;越来越多的企业开始将目光投向海外市场&#xff0c;寻求更广阔的发展空间。然而&#xff0c;海外市场的拓展并非易事&#xff0c;需要企业具备强大的全球化服务能力。作为通信行业的领军企业&#xff0c;中国联通凭借其强大的网络资源和技术实…

基于SCIP的约束处理器Conshdlr添加惰性约束——以TSP问题为例

文章目录 1. TSP案例引入2. 考虑惰性约束的求解效率对比2.1 求解基础TSP模型2.2 基于SCIP的Conshdlr添加惰性约束1. TSP案例引入 在运筹学建模和求解过程中,“lazy constraints”(惰性约束)是一种动态添加约束的策略,松弛部分约束后求解得到的“可行解”,不断地进行可行性…

求职分享123

阿里学长 简历&#xff1a;github上找&#xff0c;填信息 项目&#xff1a; 1. 教研室项目 2. github上下载项目下来做 3. 对于项目&#xff0c;要把个人工作详细地准备下来。 4. 给面试官挖坑。 5. 企业实习是巨大的加分项。 知识储备 刷题 不卷&#xff0c;leetcod…

同步和异步程序的关联和区别是?Guide to Synchronous and Asynchronous Code

2024/3/12 发布 正在寻觅一份前端开发工作&#xff0c;如果您觉得这篇文章对你有所帮助&#xff0c;这是我的简历1 在这篇文章中你能学习和理解&#xff1a;NodeJS是如何工作、如何处理所有发送给服务器的函数&#xff08;无论同步或者异步&#xff09;和请求、Event Loops in …

rk36566 uboot - dm 模型数据结构与常见接口

文章目录 一、数据结构1、udevice2、driver3、uclass4、uclass\_driver5、 总结6、device\_probe 二、常用接口1、udevice 创建接口1) device_bind_with_driver_data2) device_bind3) device_bind_by_name 2、uclass 操作函数1) uclass_get2) uclass_get_name3) uclass_find_de…

LeetCode 面试经典150题 27.移除元素

题目&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数…

efcore coderfirst 生成数据库

使用 Entity Framework Core 的 Code First 方法开发时&#xff0c;你可以根据定义的实体模型和 DbContext 类自动生成数据库和表结构。下面的步骤将指导你如何使用 EF Core Code First 来生成数据库。 1. 安装必要的 NuGet 包 首先&#xff0c;确保已经安装了 Entity Framew…

Cesium 地图鼠标悬浮某个位置显示弹窗

问题&#xff1a;地图上显示了图标&#xff0c;在鼠标悬浮在地图上时&#xff0c;不出现弹窗&#xff0c;当悬浮在地图的图标上时&#xff0c;显示该图标的信息解决过程&#xff1a; 1.建立处理用户输入事件的画布&#xff0c;写出要在输入事件上执行的功能。 2.Cesium.ScreenS…

python调用jar中java方法 静态类为例

java package test;public class test {// run方法返回当前脚本路径public static String runV1(String s) {return "log: " System.getProperty(s);}}python import jpype from jpype import * import osif __name__ "__main__":print(os.environ[JAV…

java中的日期类

1.1 第一代日期类 第一代日期时间API主要有java.util.Date和日期时间格式化有关的java.text.DateFormat及其子类。 1.1.1 Date类 JDK1.0就在java.util包下面提供了Date类用于表示特定的瞬间&#xff0c;可以精确到毫秒。   通过API或源码&#xff0c;可以看出Date类的大部…

如何计算视频流需要的服务器带宽

一、如何计算视频流需要的服务器带宽 计算视频流需要的服务器带宽涉及多个因素,包括视频的编码质量、分辨率、帧率、同时观看的用户数量等。下面是一个基本的计算方法: 确定视频的平均比特率:视频的比特率(通常以比特/秒为单位)是衡量视频数据流量的关键指标。这取决于视…

vscode 导入前端项目

vscode 导入前端项目 导入安装依赖 运行 参考vscode 下载 导入 安装依赖 运行 在前端项目的终端中输入npm run serve

NCC环境配置

一、后端配置 安装eclipse汉化插件安装svn插件调试配置中配置启动参数 -Dnc.exclude.modules${FIELD_EX_MODULES} -Dnc.runModedevelop -Dnc.server.location${FIELD_NC_HOME} -DEJBConfigDir${FIELD_NC_HOME}/ejbXMLs -DExtServiceConfigDir${FIELD_NC_HOME}/ejbXMLs -…

C#,数值计算,数据测试用的对称正定矩阵(Symmetric Positive Definite Matrix)的随机生成算法与源代码

C.Hermite 1、对称矩阵 对称矩阵(Symmetric Matrices)是指以主对角线为对称轴,各元素对应相等的矩阵。在线性代数中,对称矩阵是一个方形矩阵,其转置矩阵和自身相等。1855年,埃米特(C.Hermite,1822-1901年)证明了别的数学家发现的一些矩阵类的特征根的特殊性质,如称为埃…

ASPICE-SYSSWE

文章主要内容&#xff1a; Automotive SPICE 过程参考模型 SYS.1 需求挖掘 过程ID SYS.1 过程名称 需求挖掘 过程目的 需求挖掘过程的目的是:在产品和/或服务的整个生命周期内收集、处理和跟踪不断变化的利益相关方的需要和需求&#xff0c;从而建立一个需求基线&#x…

交换机/路由器的存储介质-思科

交换机/路由器的存储介质-思科 本文主要介绍网络设备的存储介质组成。 RAM(random-accessmemory&#xff0c;随机访问存储器) RAM中内容断电丢失&#xff0c;主要用于运行操作系统、运行配置文件、IP 路由表:、ARP 缓存、数据包缓存区。 ROM(read-only memory&#xff0c;只…

uniapp遇到的问题

【uniapp】小程序中input输入框的placeholder-class不生效解决办法 解决&#xff1a;写在scope外面 uniapp设置底部导航 引用&#xff1a;https://www.jianshu.com/p/738dd51a0162 【微信小程序】moveable-view / moveable-area的使用 https://blog.csdn.net/qq_36901092/…

持续创新引领计算机行业在数字经济时代的航向

受2024年政府工作报告的启发&#xff0c;计算机行业正站在新的发展十字路口。政府报告不仅为计算机行业的未来描绘了清晰的轮廓&#xff0c;更为行业的实践提供了扎实的政策支撑和发展空间。本文将深入分析计算机行业在数字化经济大潮中的新机遇与挑战&#xff0c;并对企业和从…

服务器数据恢复—raid5热备盘上线同步数据失败的如何恢复数据

服务器数据恢复环境&故障&分析&#xff1a; 一台存储上有一组由多块硬盘组建的raid5阵列&#xff0c;该raid5阵列中的一块硬盘掉线&#xff0c;热备盘自动上线同步数据的过程中&#xff0c;raid阵列中又有一块硬盘掉线&#xff0c;热备盘的数据同步被中断&#xff0c;r…

Apache Paimon 的 Query Service 使用

Query Service 可以运行Flink流作业来启动表的查询服务&#xff0c;当QueryService存在时&#xff0c;Flink Lookup Join将优先从中获取数据&#xff0c;这将有效地提高查询性能。 Flink SQL CALL sys.query_service(database_name.table_name, parallelism);Flink Action …