当前位置: 首页 > news >正文

操作系统-多线程案例

一、单例模式(是一种设计模式)

设计模式有很多种,不同的语法中也有不同的设计模式

单例 = 单个实例(对象)

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

实现单例模式有多种实现方法,有两种最基础的实现方式

1、饿汉模式

饿表示非常迫切,因为实例在类加载的时候就创建了,创建时机非常早,程库一启动,实例就创建了

2、懒汉模式

创建实例的时机不大一样,创建实例的时机更晚,只到第一次使用才会创建实例

首次调用getlnstane,此时 instance 引用为 null,就会进入 if 条件,从而把实例创建出来,后续再调用 getInstance ,由于 instance 不再是null,此时不会进入 if ,直接返回之前创建好的引用

该操作的执行时机并不确定,甚至可能整个程序压根用不到这些方法,就把创建的操作省下来了

饿汉模式: getInstance 直接返回 Instance 实例,该操作的本质就是读操作,多个线程同时读是线程安全的

懒汉模式:有读有写,是线程不安全的

1、该线程安全问题,本质上是读,比较,写这三个操作不是原子的,导致后一个线程读的值,前一个线程还没写(脏读),把锁加在外面才能保证读和修改是一个整体

2、代码每次 getInstance 都要加锁,但加锁只是在 new 出对象前加上很必要,对象new完以后,后续调用getinstance是读操作,不用加锁

可以给上述代码一个判定:对象未创建才加锁,创建了就不加锁了

3、指令重排序引起的线程问题,指令重排序也是编译器优化的一种方式

调整原有代码的执行顺序,保证逻辑不变的情况下提高程序的效率,解决该问题核心思路还是volatile

二、阻塞队列(基于普通队列做出的扩展,先进先出,线程安全的)

1、带有阻塞性质

若是对一个已经满了的队列进行入队列,此时入队列就会阻塞,一直到队列不满结束

若是对一个已空的队列进行出队列,此时出队列就会阻塞,一直到队列不空结束

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

引入生产者消费者模型是为了更好做到“解耦合“

实际开发中,经常会涉及到分布式系统(服务器的功能不是由一个服务器来完成的,而是每个服务器负责一部分功能,最后通过服务器之间的网络通信,完成整个功能)

3、阻塞队列代价:需加机器,引入更多的硬件资源

1、上述阻塞队列并非是简单的数据结构,而是基于这个数据结构实现的服务器程序,又被布署到单独的主机上了(被称为消息队列message queue)

2、整个系统的结构更复杂了,要维护的服务器更多了

3、效率会降低,引入中间商还是有差价的,请求从A发送给B,这个过程要经历队列的转发,也是有一定开销的

4、削峰填谷

外界请求突发峰值,突发的峰值就会使抗压能力更弱的服务器挂掉,使用阻塞队列,即使外面的请求出现峰值,也是由队列来承受峰值请求,队列无业务逻辑,只是存储数据,抗压能力是比较强的

当请求出现谷值,队列也会照常提供给服务器请求,让服务器保证正常运转

5、Java中提供了现成的阻塞队列数据结构

ArrayBlockingQueue 基于数组实现

LinkedBlackingQueue 基于链表实现

PriorityBlackingQueue 带优先级的队列

put 方法是带阻塞的加入,offer 不带阻塞,take方法出队列也是带阻塞的

对程序的优化,归根结底增加机器、增加硬件资源是最立杆见影的做法,仅仅是软件层面的优化,投入产出比较低

实际开发中,生产者消费者模型,住往是多个生产者,消费者,这里的生产者和消费者不仅仅是一个线程,也可能是一个独立的服务器程序,其至是一组服务器程序

生产者消费者模型核心仍是阻塞队列,使用synchronized 和 wait/notify来达到线程安全和阻塞

三、实现定时器

设定一个时间,当时间到了的时候,定时器自动去执行某个逻辑

什么样的情况能的使用lambda,得是函数式接口(interface只能有这一个接口)

Timer里内置了线程(前台线程),timer 不知道代码是否会添加新的任务进来,处于严阵以待的状态,要使用 cncel 主动结束否则 timer 不知道是否其他地方要继续添加任务

定时器核心:

1、有个扫描线程,负责判定时间到/执行任务

2、还要有个数据结构保护所有被注册的任务

数据结构用优先级队列来表示(在多线程下使用,调用 schedule 是一个线程,扫描是另一个线程,要关注线程安全问题)

四、线程池

提前把要用的对象准备好,用完的对象也不要立刻释放,先留着下次备用

虽然线程成本低,但是频繁的创建和销毁开销还是很大的

1、优化方案

1、引入轻量级线程:也称为纤程/协程,协程本质是程序员在用户代码中进行调度,不是靠内核的调度器调度,节省了很多调度上的开销

2、线程池

在使用过程中并未真的频繁创建销毁,而只是从线程池里取线程,使用完了还给线程池,从线程池中取线程(纯用户代码,可控)

通过系统申清来创建线程,需要内核来完成,(不太可控)

2、标准库中的线程池 ThreadPoolExecutor

这个类,构造方法的参数,侧面映射出线程池的设计思路,需要咱们了解一下标准库提供的线程池,持有的线程个数并非是一成不变的,会根据当前任务量自适应线程数

int corePoolSize 核心线程数(线程池内最少有多少线程)

int maximumpoolSize 最大线程数(线程池内最多有多少线程)

kpepAliveTime  实习生线程空闲时间超过了这个时间阈值,就会被销毁

BlockingQueue<Runnabe>  使用Runnable作为描述任务的主体,若想任务带有优先级,则使用PriorityBlrkingQueue

ThreadFactory  线程工厂(工厂模式也是常见的设计模式)

通过静态方法封装 new 操作,在方法内部没定不同属性完成对象初始化,构造对象的过程就是工厂模式

线程工厂提供了方法,让方法封装 new Thread 操作并给 Thread 设置一些属性

3、RejectedExecutionHandler(拒绝策略)

线程池能容纳的元素是有限的,若继续添加任务会怎么样

AborPolicy:继续添加任务,直接抛出异常,新的任务未完成,旧的任务也没法做了

calerRunsPolicy: 新的任务由添加任务的线程执行

discardoldestPolicy:丢弃最老的任务

discardPolicy:丢弃最新任务(调用的线程不执行该任务,线程池也不执行)

创建线程池要没定线程池的线程数量,若一个进程中所有的线程都是cpu密集型,每个线程所有工作都是在cpu上执行的,此时线程数不该超过N(cpu核心数)

若一个进程的所有线程都是IO密集型,每个线程大部分工作都等待IO,cpu消耗很少,此时线程数可以很多,远远超过N

综上,由于程序的复杂性很难对于线程池的线程数进行估数,可通过测试的方式,尝试给线程池设定不同的线程数目分别进行能测试,衡量每种程数目下总的时间开销和系统资源占用的开销,找到二者的合适值

相关文章:

操作系统-多线程案例

一、单例模式&#xff08;是一种设计模式&#xff09; 设计模式有很多种&#xff0c;不同的语法中也有不同的设计模式 单例 单个实例&#xff08;对象) 某个类&#xff0c;在一个进程中&#xff0c;只应该创建出一个实例&#xff0c;&#xff08;原则上不该有多个&#xff…...

什么是FUSE用户态文件系统

零. 文件系统 1. 为什么要有文件系统 文件系统是操作系统中管理文件和目录的一种机制。它提供了组织、存储、检索和更新文件的方法&#xff0c;主要如下&#xff1a; 数据组织&#xff1a;文件系统将数据组织成文件和目录&#xff0c;使用户能够更方便地管理和查找文件。每个…...

[每日一练]销售分析(通过数据的0/1转换进行是否存在的查询)

#该题目来源于力扣&#xff1a; 1083. 销售分析 II - 力扣&#xff08;LeetCode&#xff09; 题目要求&#xff1a; 表&#xff1a;Product----------------------- | Column Name | Type | ----------------------- | product_id | int | | product_name | varch…...

.NET Core WebApi第7讲:项目的发布与部署

一、理解 前端跟后端拿数据&#xff0c;然后在前端页面中展示&#xff0c;就是我们要完成的事情。 把前端跟后端开发好之后&#xff0c;我们需要落地部署&#xff0c;这个时候就需要一个服务器。 服务器就是一台电脑&#xff0c;只要windows里面有一个叫IIS的管理器。 二、项目…...

【python 将数据写入csv文件】正确方式

data [{username: jack, password: 1234}, ……]# 保存为CSV文件 with open(IP_output.csv, w, newline, encodingutf-8) as file:fieldnames [username, password]writer csv.DictWriter(file, fieldnamesfieldnames, quotingcsv.QUOTE_NONE)writer.writeheader() # 写入列…...

OpenCV4.8 开发实战系列专栏之 10 - 像素值统计

大家好,欢迎大家学习OpenCV4.8 开发实战专栏,长期更新,不断分享源码。 专栏代码全部基于C++ 与Python双语演示,专栏答疑群 请联系微信 OpenCVXueTang_Asst 本文关键知识点:像素值统计 最小(min)最大(max)均值(mean)标准方差(standard deviation)API知识点 最大最小值min…...

pandas计算相关性并画热力图

实现这个功能有很多方法&#xff0c;但是下面的方法还是比较优雅的&#xff1a; cols ["ASSET", "HOUSES", "INCOME", "DEBT", "EDUC"] corr df[cols].corr() corr.style.background_gradient(axisNone)讲解&#xff1a; …...

初始Docker

概述&#xff1a; 容器&#xff0c;作为云原生技术的重要组成部分&#xff0c;与虚拟机一样&#xff0c;均属于虚拟化技术的范畴。然而&#xff0c;容器技术以其独特的优势&#xff0c;在虚拟化领域中脱颖而出。与虚拟机不同&#xff0c;容器能够摆脱操作系统的束缚&#xff0…...

Redis-概念、安装、基本配置

文章目录 一、Redis及Redis集群概念、分布式系统概念一-1 Redis是什么一-2 什么是分布式系统、分布式缓存一-3 什么是Redis集群、实现Redis集群的方法有哪些、这些跟Redis的sentinel和cluster有什么关系一-4 Redis的库一-5 Redis中的Key与Value是什么、如何进行操作使用它们添加…...

qt QPlainTextEdit详解

QPlainTextEdit是一个功能强大、易于使用的纯文本编辑器/查看器。它使用与QTextEdit相同的技术和概念&#xff0c;但是为纯文本的处理进行了优化&#xff0c;因此更适合处理大型纯文本文档。QPlainTextEdit不提供富文本编辑功能&#xff0c;如字体、颜色、大小等的格式化&#…...

【机器学习】23. 聚类-GMM: Gaussian Mixture Model

1. 定义和假设 定义&#xff1a;probabilistic clustering&#xff08;model-base&#xff09; 假设&#xff1a;数据服从正态分布 2. 算法内容 我们假设数据是由k个高斯&#xff08;正态&#xff09;分布混合生成的。每个分布有2个参数&#xff1a;μ和σ。 一个分布对应一…...

深度探索C++对象模型

文章目录 前言一、关于对象C对象模型 二、构造函数实例分析 拷贝构造函数程序转化语意学(Program Transformation Semantics)成员初始化列表 三、数据语义学(The Semantics of Data)数据存取多种继承情况讨论仅单一继承加上虚函数多重继承虚拟继承 Pointer to Data Members 四、…...

电脑怎么设置开机密码:保障个人信息安全的第一步

在数字化时代&#xff0c;个人信息的安全至关重要。电脑作为我们日常工作和生活中不可或缺的设备&#xff0c;存储了大量的私人数据和敏感信息。为了防止未经授权的访问&#xff0c;设置开机密码是保护个人隐私和信息安全的基本措施之一。本文将详细介绍如何在不同操作系统下为…...

MybatisPlus入门(六)MybatisPlus-null值处理

一、MybatisPlus-null值处理 1.1&#xff09;问题引入&#xff1a; 在查询中遇到如下情况&#xff0c;有部分筛选条件没有值&#xff0c;如商品价格有最大值和最小值&#xff0c;商品价格部分时候没有值。 1.2&#xff09;解决办法&#xff1a; 步骤一&#xff1a;新建查询实…...

红帽认证有必要考吗?这四大人群推荐考取!

红帽认证(Red Hat Certification)作为全球公认的Linux技能认证&#xff0c;对于某些特定人群来说&#xff0c;考取这一认证无疑是一个明智的选择。本文将探讨红帽认证的必要性&#xff0c;并为四类人群提供考取红帽认证的建议。 1. IT专业人士 对于IT专业人士来说&#xff0…...

基于SSM+微信小程序的社团登录管理系统(社团1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 2、项目技术 3、开发环境 4、功能介绍 1、项目介绍 基于SSM微信小程序的社团登录管理系统实现了管理员及社团、用户。 1、管理员实现了首页、用户管理、社团管理、社团信息管理、社…...

html中cookie如何存储

在HTML中&#xff0c;可以使用JavaScript来创建、读取和删除cookie。以下是创建和读取cookie的基本示例&#xff1a; 创建cookie: function setCookie(name, value, daysToLive) { var cookie name "" encodeURIComponent(value); if (typeof daysToLive …...

C++基础三(构造函数,形参默认值,函数重载,单例模式,析构函数,内联函数,拷贝构造函数)

C有六个默认函数&#xff0c;分别是&#xff1a; 1、默认构造函数; 2、默认拷贝构造函数; 3、默认析构函数; 4、赋值运算符; 5、取址运算符; 6、取址运算符const; 构造函数 构造函数(初始化类成员变量)&#xff1a; 1、属于类的成员函数之一 …...

Flutter Color 大调整,需适配迁移,颜色不再是 0-255,而是 0-1.0,支持更大色域

在之前的 3.10 里&#xff0c; Flutter 的 Impeller 在 iOS 上支持了 P3 广色域图像渲染&#xff0c;但是当时也仅仅是当具有广色域图像或渐变时&#xff0c;Impeller 才会在 iOS 上显示 P3 的广色域的颜色&#xff0c;而如果你使用的是 Color API&#xff0c;会发现使用的还是…...

如何使用VBA识别Excel中的“单元格中的图片”(2/2)

Excel 365升级了新功能&#xff0c;支持两种不同的插入图片方式&#xff1a; 放置在单元格中&#xff08;Place in cell&#xff09;&#xff0c;新功能&#xff0c;此操作插入的图片下文中简称为单元格中的图片。放置在单元格上&#xff08;Place over cell&#xff09;&…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...