【Java】Java实现100万+ 的高并发、高性能设计
Java实现100万+ 的高并发、高性能设计
1、简述
现百万级并发编是一项综合性的技术,同时,它与现实生活中 的场景有着紧密的联系。
搞懂并发编程有三大核心问题
分工问题
同步问题
互斥问题
本文就对这三大核心问题进行简单的介绍
2、分工问题
关于分工,比较官方的解释是:一个比较大的任务被拆分成多个大小合适的任务,这些大小合适的任务被交给合适的线程去执行。
分工强调的是执行的性能。
类比现实案例
可以类比现实生活中的场景来理解分工,例如,如果你是一家上市公司的 CEO,那么,你的主要工作就是规划公司的战略方向和管理好公司。就如何管理好公司而言,涉及的任务就比较多了。
这里,可以将管理好公司看作一个很大的任务,这个很大的任务可以包括人员招聘与管理、 产品设计、产品开发、产品运营、产品推广、税务统计和计算等。如果将这些工作任务都交给 CEO一个人去做,那么估计 CEO 会被累趴下的。
有一种很好的方式是分解公司的日常工作,将人员招聘与管理工作交给人力资源部,将产 品设计工作交给设计部,将产品开发工作交给研发部,将产品运营和产品推广工作分别交给运 营部和市场部,将公司的税务统计和计算工作交给财务部。
这样,CEO 的重点工作就变成了及时了解各部门的工作情况,统筹并协调各部门的工作, 并思考如何规划公司的战略。
将公司的日常工作分工后,可以发现,各部门之间的工作是可以并行推进的。例如,在人力资源部进行员工的绩效考核时,设计部和研发部正在设计和开发公司的产品,与此同时,公司的运营人员正在和设计人员与研发人员沟通如何更好地完善公司的产品,而市场部正在加大力度宣传和推广公司的产品,财务部正在统计和计算公司的各种财务报表等。一切都是那么有条不紊。
所以,在现实生活中,安排合适的人去做合适的事情是非常重要的。映射到并发编程领域 也是同样的道理。
并发编程中的分工
在并发编程中,同样需要将一个大的任务拆分成若干比较小的任务,并将这些小任务交给 不同的线程去执行。
将一个大的任务拆分成若干比较小的任务
在并发编程中,由于多个线程可以并发执行,所以在一定程度上能够提高任务的执行效率。
在并发编程领域,还需要注意一个问题就是:将任务分给合适的线程去做。也就是说,该由主线程执行的任务不要交给子线程去做,否则,是解决不了问题的。
这就好比一家公司的 CEO 将规划公司未来的工作交给一位产品开发人员一样,不仅不能规划好公司的未来,甚至会与公司的价值观背道而驰。
在Java 中,线程池、Fork/Join 框架和 Future 接口都是实现分工的方式。在多线程设计模式中,Guarded Suspension 模式、Thread-Per-Message 模式、生产者—消费者模式、两阶段终止模式、Worker-Thread 模式和 Balking 模式都是分工问题的实现方式。
3、同步问题
在并发编程中,同步指一个线程执行完自己的任务后,以何种方式来通知其他的线程继续执行任务,也可以将其理解为线程之间的协作,同步强调的是执行的性能。
类比现实案例
可以在现实生活中找到与并发编程中的同步问题相似的案例。
例如,张三、李四和王五共同开发一个项目,张三是一名前端开发人员,他需要等待李四的开发接口任务完成再开始渲染 页面,而李四又需要等待王五的服务开发工作完成再写接口。
也就是说,任务之间是存在依赖关系的,前面的任务完成后,才能执行后面的任务。
在现实生活中,这种任务的同步,更多的是靠人与人之间的交流和沟通来实现的。例如,王五的服务开发任务完成了,告诉李四,李四马上开始执行开发接口任务。等李四的接口开发完成后,再告诉张三,张三马上调用李四开发的接口将返回的数据渲染到页面上。
在现实生活中,张三、李四和王五的任务之间是有依赖关系的,张三渲染页面的任务依赖李四开发接口的任务完成,李四开发接口的任务依赖王五开发服务的任务完成。
并发编程中的同步
在并发编程领域,同步机制指一个线程的任务执行完成后,通知其他线程继续执行任务的方式,并发编程同步简易模型。
在并发编程中,多个线程之间的任务是有依赖关系的。
线程A 需要阻塞等待线程 B 执行完任务才能开始执行任务,线程 B 需要阻塞等待线程 C 执行完任务才能开始执行任务。线程 C 执行完任务会唤醒线程 B 继续执行任务,线程 B 执行完任务会唤醒线程 A 继续执行任务。
这种线程之间的同步机制,可以使用如下的 if 伪代码来表示。
if(依赖的任务完成){ 执行当前任务 }else{ 继续等待依赖任务的执行 }
上述 if 伪代码所代表的含义是:当依赖的任务完成时,执行当前任务,否则,继续等待依 赖任务的执行。
在实际场景中,往往需要及时判断出依赖的任务是否已经完成,这时就可以使用 while 循 环来代替 if 判断, while 伪代码如下。
while(依赖的任务未完成){ 继续等待依赖任务的执行 } 执行当前任务
上述 while 伪代码所代表的含义是:如果依赖的任务未完成,则一直等待,直到依赖的任务完成,才执行当前任务。
在并发编程领域,同步机制有一个非常经典的模型——生产者—消费者模型。如果队列已满,则生产者线程需要等待,如果队列不满,则需要唤醒生产者线程;如果队列为空,则消费者线程需要等待,如果队列不为空,则需要唤醒消费者。
可以使用下面的伪代码来表示生产者—消费者模型。
生产者伪代码
while(队列已满){ 生产者线程等待 } 唤醒生产者
消费者伪代码
while(队列为空){ 消费者等待 } 唤醒消费者
在Java 中,Semaphore、Lock、synchronized.、CountDownLatch、CyclicBarrier、Exchanger 和 Phaser 等工具类或框架实现了同步机制。
4、互斥问题
在并发编程中,互斥问题一般指在同一时刻只允许一个线程访问临界区的共享资源。互斥强调的是多个线程执行任务时的正确性。
并发编程中的互斥
在并发编程中,分工和同步强调的是任务的执行性能,而互斥强调的则是执行任务的正确性,也就是线程的安全问题。
如果在并发编程中,多个线程同时进入临界区访问同一个共享变量,则可能产生线程安全问题,这是由线程的原子性、可见性和有序性问题导致的。
而在并发编程中解决原子性、可见性和有序性问题的核心方案就是线程之间的互斥。
例如,可以使用JVM中提供的synchronized锁来实现多个线程之间的互斥,使用synchronized锁的伪代码如下。
修饰方法
public synchronized void methodName(){ //省略具体方法 }
修饰代码块
public void methodName(){ synchronized(this){ //省略具体方法 }}
public void methodName(){ synchronized(obj){ //省略具体方法 } }
public void methodName(){ synchronized(ClassName.class){ //省略具体方法 } }
修饰静态方法
public synchronized static void staticMethodName(){ //省略具体方法 }
除了synchronized 锁,Java 还提供了 ThreadLocal、CAS、原子类和以CopyOnWrite 开头的并发容器类、Lock 锁及读/写锁等,它们都实现了线程的互斥机制。
相关文章:
【Java】Java实现100万+ 的高并发、高性能设计
Java实现100万 的高并发、高性能设计 1、简述 现百万级并发编是一项综合性的技术,同时,它与现实生活中 的场景有着紧密的联系。 搞懂并发编程有三大核心问题 分工问题 同步问题 互斥问题 本文就对这三大核心问题进行简单的介绍 2、分工问题 关于分工…...
linux系统下,在vscode的命令行中调试python文件
首先参考vscode官网文档Command line debugging 步骤 1(只需一次):安装debugpy 步骤 2:在命令行中运行 python -m debugpy --listen 5678 --wait-for-client -m dir1.dir2.your_script 以上命令使用了端口5678,也可…...

DFS(分布式文件系统)与 DFSR(分布式文件系统复制)的区别
DFS(分布式文件系统)和 DFSR(分布式文件系统复制)是两种不同的技术,尽管它们在名称上有一些相似之处,但它们的用途和功能有所不同。 DFS(分布式文件系统) DFS 是一种用于创建和管理…...

丈母娘说:有编制的不如搞编程的
10月17日百度世界大会召开,据说文心大模型又牛X了,综合水平相比GPT4毫不逊色,真是个让人激动的消息,国产大模型的进展可以说是日新月异,我这耳朵边一直响彻四个字:遥遥领先。 不过今天我关注的重点不是什么…...
vue 部署后 405 not allowed
关于部署vue项目dist包,在nginx配置遇到的坑: 1.vue项目中vue.config.js的配置:devServer.proxy 可以是一个指向开发环境 API 服务器的字符串: evServer: {proxy: {/prod-api: {target: http://192.168.0.68:38090;,changeOrigi…...
【限时免费】20天拿下华为OD笔试之【回溯】2023Q1-硬件产品销售方案【欧弟算法】全网注释最详细分类最全的华为OD真题题解
【回溯】2023Q1-硬件产品销售方案 题目描述与示例 题目描述 某公司目前推出了 AI 开发者套件、AI 加速卡、AI 加速模块、AI 服务器、智能边缘多种硬件产品,每种产品包含若干个型号。现某合作厂商要采购金额为 amount 元的硬件产品搭建自己的 AI 基座。假设当前库…...

蜻蜓c影视追剧系统-多个小程序添加说明
多小程序添加设置 蜻蜓c影视追剧 支持多小程序添加,也就是可以管理不同前端的小程序。 此处id 对应前端小程序的mp值 关于添加小程序: 此处有所有填写内容的参考方式,要注意是必须开通了微信支付才可以添加,这里需要添加证书信息…...
linux 测试存储介质.emmc.nand.ufs.硬盘的读写速度方法
一、测试写速度 创建一个test.sh脚本 #!bin/bashcnt1 while [ $cnt -lt 50 ] // 循环50次 doecho "dd cnt $cnt" > /dev/consoledd if/dev/zero of/rawdata/test_${cnt}.txt bs1024 count102400//往储存介质分配的一个rawdata分区,写文件࿰…...

基于 KubeSphere 部署 KubeBlocks 实现数据库自由
作者:尹珉, KubeSphere Contributor & Ambassador,KubeSphere 社区用户委员会杭州站站长。 KubeSphere 是什么? KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持…...

图像识别-人脸识别与疲劳检测 - python opencv 计算机竞赛
文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是…...

高性能计算与多模态处理的探索之旅:英伟达GH200性能优化与GPT-4V的算力加速未来
★多模态大模型;GPU算力;LLMS;LLM;LMM;GPT-4V;GH200;图像识别;目标定位;图像描述;视觉问答;视觉对话;英伟达;Nvidia&#…...
代码随想录算法训练营Day59|动态规划17
代码随想录算法训练营Day59|动态规划17 文章目录 代码随想录算法训练营Day59|动态规划17一、647. 回文子串二、516.最长回文子序列 一、647. 回文子串 class Solution {public int countSubstrings(String s) {boolean[][] dp new boolean[s.length()][s.length()];int res …...
软考 系统架构设计师系列知识点之软件构件(2)
接前一篇文章:软考 系统架构设计师系列知识点之软件构件(1) 所属章节: 第2章. 计算机系统基础知识 第3节. 计算机软件 2.3.7 软件构件 3. 商用构件的标准规范 当前,主流的商用构件标准规范包括对象管理组织ÿ…...

【试题011】C语言多个运算符计算例题
1.题目:表达式1!23/45%6(78)9的值是? 2.代码: #include <stdio.h> int main() {//表达式1 !2 3 / 4 5 % 6 (7 8) 9的值printf("%d\n", (1 !2 3 / 4 5 % 6 (7 8) 9));//分析:多个运算符先考虑优先级…...
win10系统同时安装 vue2和vue3
https://www.cnblogs.com/xiaohuasan/p/16030569.html...

带声学释放器的近海海底潜标的回收记录
我们主要在大洋调查中使用带声学释放器的海底潜标,在近岸海域很少这样做,因为近岸海域拖网作业较多,海底潜标很容易被渔网拖走或移位。前段时间,我们在近海也使用了这种方式,主要考虑到测区水深较深,即使是…...

新加坡服务器托管
新加坡是一个小而繁荣的国家,是东南亚唯一一个发达国家。它地理位置好,毗邻马来西亚和印度尼西亚,新加坡是一个拥有先进科技和强大经济的国家,主要以制造业、金融、旅游和航运为主,拥有先进的经济和现代化的基础设施&a…...

Si24R2|2.4G单发射芯片 +7dBm可调功率 校讯通
Si24R2是一种通用、低功耗、高性能的2.4GHz无线射频发射芯片,主要用于单向通信系统,以降低系统成B,在运行中与si24r1兼容。 Si24r2具有低功耗和低成B。 它主要用于单向低功率传输系统,如无线控制系统、无线数据采集系统等。 Si2…...

如何让ChatGPT生成图片?
目录 一、那么如何解决让ChatGPT具有画图能力的问题呢? 二、那ChatGPT为什么能生成图片呢? 我们都知道ChatGPT只是个纯文本的AI模型,不具备画图能力。它可以生成文本,但如果让他生成图片就会显示如下的声明: 但通过本…...
从零开始学习 Java:简单易懂的入门指南之反射(三十八)
反射 1. 反射1.1 反射的概述:1.2 学习反射到底学什么?1.3 获取字节码文件对象的三种方式1.4 字节码文件和字节码文件对象1.5 获取构造方法1.6 获取构造方法并创建对象1.7 获取成员变量1.8 获取成员变量并获取值和修改值1.9 获取成员方法1.10 获取成员方法…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...