了解并发编程

news2024/11/24 22:53:29

并发与并行的概念:

并发:一段时间内(假设只有一个CPU)执行多个线程,多个线程时按顺序执行

并行:同个时间点上,多个线程同时执行(多个CPU)

什么是并发编程?

在现代互联网的应用中,会出现多个请求同时对共享资源的访问情况,例如在买票,秒杀与抢购的场景中

此时就会出现线程安全的问题,并发编程就是通过编程控制多个线程依次执行防止线程安全的问题出现

并发问题产生的根本原因

多核CPU的处理

基于java的内存模型

JMM

JMM全称Java Memory Model表示Java内存模型,是java虚拟机中所进行规范的

java内存模型中规定所有的变量都存储在工作内存中,所有的线程共享工作内存中的变量

每个线程都会有自己私有的工作内存,线程会将工作内存中的共享变量读取到工作内存中作为缓存

 

并发编程解决的核心问题

可见性

可见性指的是线程在对共享变量进行修改之后,其他线程时能够立即知道

现在的多核CPU的处理中单个线程对共享变量进行修改后,其他的线程是不可见的

有序性

有序性是指的代码运行的顺序是按照的编写的顺序运行的

在代码编译运行的过程中,CPU为了提高性能,可能会打乱代码原来的编写顺序,比如需要读取一个读取时间较长的变量时,可能会跳过它去读取速度较快的变量

这是由于CPU的读等待机制造成的,CPU在读取一个读时间长的变量时会去同时读取其他的变量

原子性

原子性指的是操作的原子性,在多个指令操作同时进行时应该保证这多条命令的一致性执行

比如说"i++"这个操作是在高级语言中是一条编程指令,但实际上在CPU执行的时候可以拆分为三条CPU的执行指令,分别是从主内存中读取变量i的值,在工作内存中对变量的值进行操作,然后在对主内存中的值进行更新

如果此时多核的CPU支持线程切换的调度,则会导致"i++"这一条命令还没有执行完成就进行了线程的切换,导致出现的线程安全问题

 

小结

可见性的问题是由缓存导致的,有序性的问题是由编译导致的,原子性的问题是由线程切换导致的

三个问题出发点都是的为了的提高程序的性能,这与并发程序编写的目的是一致的

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

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

相关文章

【排序算法】选择排序(Selection sort)

选择排序(Selection sort)是一种简单直观的排序算法。选择排序介绍它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排…

c/c++开发,无可避免的宏定义使用案例

一、c/c宏定义的来源 宏定义,就是用一个标识符来表示一个字符串,如果在后面的代码中出现了该标识符,那么就全部替换成指定的字符串。通常c/c宏定义这几处出处: 1)最常见的就是来自于开发者编码过程中采用宏定义命令“#…

发烧友实测 | 飞凌嵌入式OKA40i-C开发板试用体验之远程视频监控

本篇试用报告由发烧友zealsoft提供,感谢zealsoft的支持。飞凌嵌入式会在电子发烧友和电路城论坛持续开展开发板有奖试用活动,更有京东E卡等着你!欢迎大家的持续关注。“感谢飞凌嵌入式公司提供了本次OKA40i-C开发板的评测机会。上次我们介绍了…

网络流量传输MTU解析

基本概念 以太网的链路层对数据帧的长度会有一个限制,其最大值默认是1500字节,链路层的这个特性称为MTU,即最大传输单元 Maximum Transmission Unit,最大传输单元,指的是数据链路层的最大payload,由硬件网…

高压放大器在孔道灌浆非线性超声测试中的应用

实验名称:高压放大器在孔道灌浆非线性超声测试中的应用研究方向:无损检测测试目的:超声波作为频率高于20kHz的声波被广泛应用于各类结构的无损检测中,以超声波作为探伤波的无损检测法称为超声波无损检测法,简称超声波法…

嵌入式开发:通过嵌入式虚

嵌入式虚拟化为实现多核处理能力的优势提供了一种可扩展的机制。嵌入式应用中的虚拟化与其企业和桌面应用有许多共同之处。独特的嵌入式使用案例和专业的底层技术为嵌入式开发人员提供了优化性能和响应设计的新机会。在台式机、数据中心以及现在的嵌入式设计中采用多核技术可以…

React hooks之useState用法(一)

系列文章目录 学习React已经有很长的一段时间了,今天决定重新回顾一下跟React相关的一些知识点 文章目录系列文章目录结构如下一、hooks是什么?useState可以能做什么二、如何使用useState()第一步:创建【函数组件&…

java 代码

java 分层架构的由来目录概述需求:设计思路实现思路分析参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. ha…

运维必会:ansible剧本(piaybook)

playbooks 概述以及实例操作 Playbooks 组成部分: Inventory Modules Ad Hoc Commands Playbooks Tasks: 任务,即调用模块完成的某些操作 Variables: 变量 Templates: 模板 Handlers: 处理器,由某时间触发执行的操作 Roles: 角色 YAML 介绍…

Individual Tree Segmentation from LiDAR Point Clouds for Urban Forest Inventory

Abstract 本研究的目的是使用 LiDAR 点云数据开发单棵树级别的自动化城市森林清单的新算法。激光雷达数据包含三维结构信息,可用于估算树高、基高、树冠深度和树冠直径。这使得精确的城市森林库存可以细化到单棵树。与大多数已发布的从 LiDAR 派生的栅格表面检测单…

学了这么久python,不会连自己啥python版本都不知道吧?

人生苦短,我用Python 源码资料电子书:点击此处跳转文末名片获取 查看 Python 版本 我们可以在命令窗口(Windows 使用 winR 调出 cmd 运行框)使用以下命令查看我们使用的 Python 版本: python -V 或 python --version 以上命令执行结果如下: …

Axure 初学者容易涉及的雷区

​工具学习是成为产品经理的一部分学习,工具学习总是伴随着痛苦和煎熬的,因为学习本身就伴随着枯燥和重复。 在未来你的Axure学习可能会出现这些情况呢?还没接触过axure的或者打算进行axure的朋友可能会有疑问。这里根据我们学员学习axure的经…

CentOS8基础篇4:使用U盘备份文件

一、挂载点 所谓的挂载点就是文件系统中存在的一个目录,通常情况下,创建在/mnt目录下,挂载成功后,访问挂载点就是访问新的存储设备。 挂载点应该是空目录,否则原来该挂载点中存在的文件将会被隐藏。而且,…

谷粒学苑第二章前端框架-2.1登录功能

一、vue-admin-template的config模块 vue-admin-template支持多环境,config配置模块提供了dev和prod两种环境。而BASE_API存储的是URL前部分,再拼接上controller的URL,即是完整的URL。修改为自己的协议://ip:port 二、vue-admin-template的s…

.net6API使用SignalR+vue3聊天+WPF聊天

目录 一、.net6api接口 二、vue3前端 三、WPF客户端 此案例分为3部分。首先创建.net6api接口,然后使用前端vue3进行聊天,再使用wpf客户端进行聊天,并且互通聊天。 一、.net6api接口 1.首先建立一个能正常运行的api,然后增加Ch…

redis未授权访问漏洞的三种场景复现以及加固思路

1.redis简介 redis是一个 非常快速 的,开源的,支持网络,可以基于内存,也可以持久化的日志型, 非关系型 的键值对数据库。并提供了多种语言的api。有java,c/c,c#,php,JavaScript,per…

1.Linux编程-gcc编译器

gcc的工作流程 gcc编译器将c源文件到生成一个可执行程序,中间一共经历了四个步骤: 四个步骤并不是gcc独立完成的,而是在内部调用了其他工具,从而完成了整个工作流程, 其中编译最耗时, 因为要逐行检查语法. gcc的工作流程: 1 预处理: cpp预处理器, 去掉注释, 展开头文件, …

Java进程CPU高负载排查步骤

近期发现服务器Java进程负载,超过100%一、采用top命令定位进程登录服务器,执行top命令,查看CPU占用情况,找到进程的pid很容易发现,PID为29706的java进程的CPU飙升到700%多,且一直降不下来,很显然…

python—requests模块详解

一、前言 1、requests简介 requests是一个很实用的Python HTTP客户端库,爬虫和测试服务器响应数据时经常会用到,它是python语言的第三方的库,专门用于发送HTTP请求,使用起来比urllib更简洁也更强大。 2、requests库的安装 方法…

CUDA中的数学方法

CUDA中的数学方法 文章目录CUDA中的数学方法1. Standard FunctionsSingle-Precision Floating-Point FunctionsDouble-Precision Floating-Point Functions2. Intrinsic FunctionsSingle-Precision Floating-Point FunctionsDouble-Precision Floating-Point Functions参考手册…