多线程新手村3--多线程代码案例

1.1 单例模式

单例模式是设计模式中非常经典的一种。那么有同学肯定就会好奇了,什么是设计模式呢?

设计模式简单的说就是程序员的“棋谱”,我们下象棋时肯定或多或少都背过棋谱,例如当头炮、马后炮等,设计模式也是这样,开发过程中常常会遇到一些经典场景,用固定的解决方案去解决这些问题,这就是设计模式,今天我们先来介绍一下单例模式。

单例模式是指某个类只能实例化一个对象,不能有多个,这一点在很多场景中都会用到,例如数据库中的DateSource实例就只需要一个;单例模式又有两种实现方式,分别为饿汉模式和懒汉模式。

1.1.1 饿汉模式

在类加载的时候,创建实例(比较急切)

可以看到,由于将构造方法设为私有,所以当我们想要自己实例化一个对象的时候,编译器会报错,此时,这个类将只会有加载类时实例化的那一个对象,无法再实例化出其它对象。

1.1.2 懒汉模式

只有当需要的时候才创建实例

上述代码可以看出,只有当首次调用getInstance方法时才会创建实例,否则将不会创建实例。

单线程中懒汉模式没有问题,但是放在多线程中,就会存在许多bug!

1.1.3 懒汉模式(多线程版)

首先要解决一个疑惑,为什么饿汉模式的单线程都不会有bug,但是懒汉模式的多线程会存在bug呢?是因为饿汉模式的getInstance方法只有读功能,但是懒汉模式的getInstance方法却既可读又可写,两个线程对于同一个变量进行写操作,就很容易出现问题。所以我们要加锁,将操作变为原子性的,这样就不会出现问题了。

1、这里的加锁是为了保证原子性操作,防止代码出bug(new多个对象出来)

2、这里再一次判断对象是否为空是为了确定要不要加锁,因为如果不加这个代码的话,每次调用这个方法都会加锁,但是加锁很费时,效率很低,不好!

3、此处的volatile关键字是为了防止出现指令重排序问题。

1.2 阻塞队列

阻塞队列是多线程代码中常用的一种数据结构。

所谓阻塞队列,其实就是加了阻塞功能的队列。

a)如果队列为空,继续出队列,就会发生阻塞,直到其它线程向队列中加入元素。

b)如果队列为满,继续入队列,也会发生阻塞,直到其它线程向队列中取走元素。

阻塞队列,最大的意义是用来实现“生产者消费者模型”

“生产者消费者”模型的意义:

1、解耦合(单独设置一个队列,使原本两个直接进行数据交互的元素通过这个队列进行交互)

2、削峰填谷

当数据请求量很大的时候,如果没有阻塞队列的话,服务器A一直给服务器B发数据,就可能使服务器B崩溃;但是如果设置一个阻塞队列,那么A只需要将数据放入队列中,如果B此时已达到最大处理负荷的话,那B只需要慢慢的取出队列中的数据处理即可;反之,如果此时数据请求量很小,那么服务器B就可以慢慢地消耗掉堆积在阻塞队列中的数据。

1.3 阻塞队列的代码实现

以上代码就是自己实现了一个简易的阻塞队列,可以用作一个简单的“生产者消费者”模型。注意两个wait和notify都是互相唤醒的,无法自己唤醒自己。

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

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

相关文章

接口性能测试复盘:解决JMeter超时问题的实践

在优化接口并重新投入市场后,我们面临着一项关键任务:确保其在高压环境下稳定运行。于是,我们启动了一轮针对该接口的性能压力测试,利用JMeter工具模拟高负载场景。然而,在测试进行约一分钟之后,频繁出现了…

剧本杀小程序开发,探索市场发展新的商业机遇

剧本杀游戏作为一个新兴行业,经历了爆发式的增长,剧本杀游戏在市场中的热度不断升高。 不过,在市场的火热下,竞争也在逐渐加大。因此,在市场竞争下,成本低、主题多样、有趣的线上剧本杀小程序成为了创业者…

竹云董事长在第二届ICT技术发展与企业数字化转型高峰论坛作主题演讲

5月25日,由中国服务贸易协会指导,中国服务贸易协会信息技术服务委员会主办的 “第二届ICT技术发展与企业数字化转型高峰论坛” 在北京隆重召开。 本次论坛以 “数据驱动,AI引领,打造新质生产力” 为主题,特邀业内200余…

WebGL实现医学教学软件

使用WebGL实现医学教学软件是一个复杂但非常有益的项目,可以显著提升医学教育的互动性和效果。以下是详细的实现步骤,包括需求分析、技术选型、开发流程和注意事项。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作…

redis-cli help使用

1. redis-cli命令使用—先连接上服务器 连接到 Redis 服务器: 使用 redis-cli 命令即可连接到本地运行的 Redis 服务器,默认连接到本地的 6379 端口。 redis-cli如果 Redis 服务器不在本地或者端口不同,可以使用 -h 和 -p 参数指定主机和端…

探索Django 5: 从零开始,打造你的第一个Web应用

今天我们将一起探索 Django 5,一个备受开发者喜爱的 Python Web 框架。我们会了解 Django 5 的简介,新特性,如何安装 Django,以及用 Django 编写一个简单的 “Hello, World” 网站。最后,我会推荐一本与 Django 5 相关…

苏洵,大器晚成的家风塑造者

💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。 苏洵,字明允,号老泉,生于宋真宗大中祥符二年(公元1009年),卒于宋英宗治平…

PPT忘记保存?教你如何轻松恢复

在日常办公中PPT文件作为主流文档格式,承载着我们大量的工作成果。然而当不小心误点了“不保存”按钮,或是遭遇软件崩溃等意外情况导致文档丢失时,文件内容是否还能够能恢复,往往成为我们最关心的问题。本文将为您提供五大免费且实…

《探索网络七层模型:构建高效通信架构的关键》

在当今数字化时代,网络通信已经成为人们生活和工作中不可或缺的一部分。而网络七层模型作为计算机网络体系结构的重要基础,其技术架构对于构建高效、稳定的通信系统具有重要意义。本文将深入探讨网络七层模型的技术架构设计,以及其在构建现代…

轻松掌握图片批量处理,赶紧学习这些小技巧!

在现今数字化的社会中,我们每天都会接触到大量的图片,无论是在工作中还是日常生活中。要想高效处理这些图片,掌握图片批量处理的技巧就显得尤为重要。幸运的是,有许多小技巧和工具可以让这一过程变得轻松愉快。 在本文中&#xf…

信息学一周赛事安排

本周比赛提醒 本周有以下几场比赛即将开始: 1.ABC-356 比赛时间:6月1日(周六)晚20:00 比赛链接:https://atcoder.jp/contests/abc356 2.ARC-179 比赛时间:6月2日(周日)晚20:00 …

excel导到access后长文本内容缺失

参考该文Excel表格如何导入Access数据库以及列内容超过255个字符被截断解决办法 - 知乎 原因是access数据中列内容超过255个字符会被截断。 解决方法:将该字段的数据类型修改为长文本即可。

微调真的能让LLM学到新东西吗:引入新知识可能让模型产生更多的幻觉

大型语言模型(llm)是在巨大的文本语料库上训练的,在那里他们获得了大量的事实知识。这些知识嵌入到它们的参数中,然后可以在需要时使用。这些模型的知识在培训结束时被“具体化”。在预训练结束时,模型实际上停止学习。 对模型进行对齐或进行…

【VTKExamples::Utilities】第十四期 Screenshot

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例Screenshot,保存窗口快照,并解析接口vtkWindowToImageFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是…

SELINUX=enforcing时无法启动httpd服务的解决方案(semanage命令以及setroubleshoot-server插件的妙用)

一、问题描述: 当/etc/selinux/conf被要求必须是SELINUXenforcing,不被允许使用setenforce 0宽松模式 我们启动httpd就会报错: Job for httpd.service failed because the control process exited with error code. See "systemctl s…

Let‘s Encrypt 免费证书申请

填写邮箱,申请的域名 单域名:www.example.com 泛域名: *.example.com yum -y install certbot sudo certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --manual --preferred-challenges dns --email xxexample…

从零开始学React--环境搭建

React官网 快速入门 – React 中文文档 1.搭建环境 下载nodejs,双击安装 nodejs下载地址 更新npm npm install -g npm 设置npm源,加快下载速度 npm config set registry https://registry.npmmirror.com 创建一个react应用 npx create-react-app react-ba…

Nginx的配置与调试

目录 1、安装Nginx 2、Nginx的配置文件结构 2.1 Nginx的全局配置 2.2 HTTP服务器配置 2.3 HttpGzip模块配置 2.4 负载均衡配置 2.5 server虚拟主机配置 2.6 location URL匹配配置 2.7 StubStatus模块配置 1、安装Nginx 在安装Nginx之前,需确保系统已经安装…

豆瓣内容抓取:使用R、httr和XML库的完整教程

概述 在数据分析和统计领域,R语言以其强大的数据处理能力和丰富的包库资源而闻名。它不仅提供了一个灵活的编程环境,还拥有专门用于数据抓取和处理的工具,如httr和XML库。这些工具使得从各种网站上抓取数据变得简单而高效。 豆瓣网站作为一个…

Android环境下Mesa初始化流程重学习之eglCreateContext

Mesa初始化流程重学习之eglCreateContext 引言 没有啥好说的了,直接上手撸代码!总得找点事情干不是!我打工我快乐!我奋斗,我快乐! 一. 核心结构体之间的关联 二. eglCreateContext流程分析 eglCreateContext(...)//s…