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

【多线程和高并发】多线程和高并发提纲

在这里插入图片描述

文章目录

  • 多线程
    • (多线程问题的)三大源头
    • 两个主要问题
    • 两大解决方案
  • 高并发问题解决方案


对多线程和高并发相关问题整理了一个简单的提纲。
通过这个提纲,足够引出对并发编程中大部分问题的讨论~

多线程

(多线程问题的)三大源头

线程并发执行带来的原子性问题。这是最主要的问题,无论是单核场景下的时间片轮转(线程切换),还是多核场景下的并行,都可能会出现多线程对同一个共享变量进行并发访问的情况,而这个访问过程可能涉及到多个步骤,并不是原子性的,这将产生竞态条件或导致数据竞争。

CPU缓存带来的可见性问题:程序员要编写符合Happens Before(可见性规则)的代码保证可见性。

大多数情况不需要担心这个问题,但如果出现了不可见的情况(比如"咦,这个修改怎么没生效?"),要想到可能是这个原因导致的。
在C/C++/Java中,可以使用volatile关键字来修饰变量,使内存中的共享变量一旦修改完毕,就会立即将该变量刷新回主内存。

编译器带来的有序性问题:编译器的优化有可能会将指令重排。这种问题通常会出现在涉及到共享数据的多线程编程中,因为编译器的优化可能会导致操作的重新排序,从而破坏了程序的预期行为,例如导致可见性问题。


两个主要问题

(线程切换带来的原子性问题,会最终表现为以下两个问题)

竞态条件。强调并发执行顺序带来的结果不一致问题。
常见的竞态条件类型:先判断后执行竞态条件、读-操作-更新竞态条件(如i++)。

数据竞争。强调并发读写导致的未定义行为,可能会引起程序的崩溃。
数据竞争的类型:读写竞争、写写竞争。


两大解决方案

同步机制:利用原子操作或锁保证同步。缺点是大量使用锁会让很多逻辑都变成同步,效率可能还不如单线程。

  • 原子操作是无锁同步机制,但仅适用于单值操作。
  • 锁适用范围广。除了常用的原生锁,分布式场景下还可能需要用到分布式锁。

数据分片(actor模型):将数据分为多个部分,由不同的线程独立处理。具体思路是根据数据所有者划分出数据主体(即actor),每个actor在自己对应的线程中处理/访问自己的数据。


高并发问题解决方案

  • 多线程:充分利用CPU性能,提高系统的性能和吞吐量。
  • 负载均衡: 使用负载均衡器将请求分发到多个服务器上,以平衡系统的负载。
  • 分布式架构:将系统拆分为多个独立的服务,采用分布式架构,可以减轻单一服务的压力,并提高整体的并发处理能力。
  • 缓存:利用缓存技术来减轻数据库和其他服务的压力。将频繁访问的数据缓存起来,以减少对底层存储系统的访问。
  • 异步处理:可以利用消息队列对消息进行异步解耦,避免大量消息等待响应。
  • 其它:水平扩展、数据库优化等。

http://www.mrgr.cn/news/58006.html

相关文章:

  • Matlab中HybridFcn参数的用法
  • JAVA Maven 的安装与配置
  • PDF工具类源码
  • Vue3父子组件中关于ref和emit的一些问题
  • 宝塔面板9.2部署jar之痛
  • MAC 电脑Office power point编辑的时候,显示“某些字体无法随演示文稿一起保存,仍然要保存演示文稿吗?”
  • Gradle核心概念总结
  • 论软件著作权
  • 线性可分支持向量机代码实现
  • Python 代码的主要功能是从给定的日志文件和设备列表中提取特定设备(华为和华三)的用户账号信息
  • Java 开发——(下篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus
  • AI基础:传教士与野人
  • Python如何处理zip压缩文件(Python处理zip压缩文件接口源码)
  • SLAM:未来智能科技的核心——探索多传感器融合的无限可
  • [蓝桥杯 2024 省 C] 回文数组
  • LeetCode199. 二叉树的右视图(2024秋季每日一题 47)
  • Linux 权限的理解
  • 前端发送请求格式
  • 1024——视触觉传感器GelSight的前世今生
  • 系统移植相关概念总结
  • 力扣周赛第420场 中等 3325.字符至少出现k次的子字符串 I
  • C语言程序设计:现代设计方法习题笔记《chapter4》
  • java的maven打包插件来了,package一键打包exe、dmg、rpm等
  • JAVA应用测试,线上故障排查分析全套路!
  • C++,STL 045(24.10.24)
  • 【Linux】进程状态及其转换