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

并发编程理论基础——可见性、原子性和有序性问题(一)

核心问题:分工,同步,互斥

  1. 分工:如何高效地拆解任务并分配给线程
    • 生产者-消费者模式、Thread-Per-Message模式、Worker-Thread模式、ComplateableFuture和CompletionService
    • Java SDK 并发包里的 Executor、Fork/Join、Future 本质上都是一种分工方法
  2. 同步:线程之间如何协作
    • 一个线程执行完了一个任务,如何通知执行后续任务的线程开工
    • Java SDK 里提供的 CountDownLatch、CyclicBarrier、Phaser、Exchanger
  3. 互斥:保证同一时刻只允许一个线程访问共享资源
    • 导致不确定的主要源头是可见性问题、有序性问题和原子性问题
    • Java SDK 里提供的 ReadWriteLock、StampedLock 可以优化读多写少场景下锁的性能

可见性、原子性和有序性问题

  1. 可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到
  2. 原子性:我们把一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性
  3. 有序性:Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。
  4. 缓存导致的可见性问题:当多个线程在不同的 CPU 上修改同一个变量时,因为多个线程不是同时启动的,有一个时差可能会导致值不一样。
  5. 线程切换带来的原子性问题:
    1. 首先将变量从内存中加载到CPU寄存器
    2. 之后执行操作
    3. 最终将结果写入内存(缓存机制导致可能写入的是CPU缓存而不是内存)
  6. (单例模式的双重检测,new指令也是3步操作,①分内存②初始化③赋值给引用变量,可能会发生①③②的重排序,这时候如果又有操作系统的分时操作的加持,导致A操作①③后挂起,时间片被分配给了B线程,而B线程甚至都不需要进行锁的获取,因为此时instance已经不等于null了,但是此时的instance可能未初始化)

 

相关文章:

并发编程理论基础——可见性、原子性和有序性问题(一)

核心问题:分工,同步,互斥 分工:如何高效地拆解任务并分配给线程 生产者-消费者模式、Thread-Per-Message模式、Worker-Thread模式、ComplateableFuture和CompletionServiceJava SDK 并发包里的 Executor、Fork/Join、Future 本质上…...

心理咨询系统源码|心理咨询系统开发|心理咨询系统

心理咨询系统,作为一种集现代化科技与专业心理服务于一体的工具,正逐渐渗透到我们生活的各个角落。它不仅为个人提供了便捷的心理支持,还为企业和组织带来了全新的管理方式。下面,我们将深入探讨心理咨询系统的可应用范围及其带来…...

Vue21-列表排序

一、需求 二、解决方式 <body><div id"root"><h2>人员列表</h2><input type"text" placeholder"请输入" v-model"keyword"><button click"sortType 1">年龄升序</button><b…...

配置 JDK 和 Android SDK

目录 一、配置JDK 1. 安装 JDK 2. JDK 环境配置 3. JDK的配置验证 二、配置 adb 和Android SDK环境 1、下载 2、配置 Android SDK 环境 一、配置JDK 1. 安装 JDK 安装链接&#xff1a;Java Downloads | Oracle 我安装的是 .zip &#xff0c;直接在指定的文件夹下解压就…...

pyechart 创建柱形图

Pyecharts 是一个基于 Python 的开源数据可视化库&#xff0c;用于创建各种交互式的图表和可视化效果。它是在 Echarts 的基础上进行封装和优化&#xff0c;Echarts 是一个流行的 JavaScript 数据可视化库pyecharts 中文网站 : https://pyecharts.org/# pyecharts 模块 还支持…...

c#引用dll报错cs8370功能“本地函数特性“在c#7.3中不可用

cs8370:功能"本地函数特性"在c#7.3中不可用 解决方法&#xff1a; 代码放在form类里面...

【STM32】输入捕获应用-测量脉宽或者频率(方法1)

图1 脉宽/频率测量示意图 1 测量频率 当捕获通道TIx 上出现上升沿时&#xff0c;发生第一次捕获&#xff0c;计数器CNT 的值会被锁存到捕获寄存器CCR中&#xff0c;而且还会进入捕获中断&#xff0c;在中断服务程序中记录一次捕获&#xff08;可以用一个标志变量来记录&#…...

C# Task

以下是 Task 类的一些关键特性和用法&#xff1a;以下是一些使用 Task 的示例&#xff1a;创建并启动一个任务使用 await 等待任务完成处理任务异常使用 Task<TResult> 获取结果取消任务 总结 在 C#中&#xff0c; Task 是 System.Threading.Tasks 命名空间中的一个类…...

进口电动蝶阀的工作原理-美国品牌

进口电动蝶阀通过电力驱动&#xff0c;实现阀门的开启、关闭和流量调节功能。其结构简单、操作方便、精确控制的特点使其在多个领域得到广泛应用。 进口电动蝶阀的工作原理可以清晰地分点表示和归纳如下&#xff1a; 一、概述 进口电动蝶阀是由电动执行器和蝶形阀组成的一种…...

Exploring Performance and Cost Optimization with ASIC-Based CXL Memory——论文阅读

EuroSys 2024 Paper CXL论文阅读笔记整理 问题 随着内存密集型应用程序对内存需求的增加&#xff0c;受限于物理限制&#xff0c;如DDR DIMM插槽的可用性和发热问题&#xff0c;以及使用高密度DIMM的成本考虑&#xff0c;现代应用程序的内存需求很容易超过单机的内存容量[2&a…...

计算机网络(4) 最长前缀匹配(路由转发表)

一.路由转发 网络数据包IP段只包含源地址与目的地址&#xff0c;经过数据链路层包装与物理层信号形式转换&#xff0c;最终经由不同的链路节点到达目的地址。这个过程是一步一步&#xff08;hop by hop&#xff09;进行的&#xff0c;路过一个路由节点则称为一跳。每个路由节点…...

向https地址发送请求失败报错

错误1&#xff1a; 10:13:47.520 [main] DEBUG org.apache.http.conn.ssl.SSLConnectionSocketFactory - Starting handshake 10:13:47.523 [main] DEBUG org.apache.http.impl.conn.DefaultManagedHttpClientConnection - http-outgoing-0: Shutdown connection 10:13:47.523…...

生信技能47 - Shell程序和R程序并行执行处理方法

Linux shell和R程序并行化执行程序方法。 1. 使用do{…} &;done;wait语句并行执行Shell 并行执行总运行时间不再是task数量*单个任务消耗时间,而是取决于单个耗时最长的任务。 # while循环,遍历test.txt文件每行 cat test.txt|while read i; dotime_stamp=$(date &quo…...

java+SimpleRegression 线性模型,针对采集到的大数据设备温度,对设备温度做出预测

首先,让我们通过以下表格展示预测模型开发 Java 的整体流程: 步骤 描述 1 数据收集与清洗 2 特征工程处理 3 模型选择与训练 4 模型评估与调优 5 模型应用与部署 然后引入java的类库 org.apache.commons.math3 math使用原则 math3可谓是轻量级自容器…...

面对失业,不得不做出改变了

有没有发现最近挣钱很难&#xff0c;生活压力很大 大批企业纷纷裁员&#xff0c;大量的就业岗位被机器人机械臂取代 很多的传统职业也将被AI替代, 比如工厂螺丝钉、司机、客服、甚至程序员、医生、等等 众多大厂开发无人驾驶出租车&#xff0c;让本来处在底层的网约车司机无…...

MT2093 活动安排

贪心策略&#xff1a; 每次选择结束时间最早的活动 代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 5e5 10; int n; struct pp {int a, b; } p[N]; bool cmp(pp x, pp y) {return x.b < y.b; } int ans 0;int main() {cin >>…...

动态javaweb 建立-准备阶段

一、实验内容&#xff1a; 1.定义一个inputjsp页面接收数据输入的长和宽。 2.创建一个javaBean&#xff0c;包含长、宽和面积三个成员变量&#xff0c;分别有对应的get方法和set方法。 3.定义一个业务模型calculate.java&#xff0c;用来计算矩形的面积。 4.定义一个…...

web前端网页设计参考:深度剖析与设计思路探索

web前端网页设计参考&#xff1a;深度剖析与设计思路探索 在Web前端开发领域&#xff0c;网页设计占据着举足轻重的地位。一个优秀的网页设计不仅能提升用户体验&#xff0c;还能有效传达品牌价值和信息。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入剖析…...

node使用http-proxy-middleware做代理,解决跨域问题

const express require(express) const history require(connect-history-api-fallback) const { createProxyMiddleware } require(http-proxy-middleware)let app express()app.use(history())// //匹配api开头的请求&#xff0c;实际转发的请求保api这三个字母 // app.u…...

爱奇艺视频怎么转换成mp4格式,爱奇艺qsv转换mp4最简单方法

在数字化时代&#xff0c;视频格式的转换成为了我们日常生活中常见的需求。特别是对于那些经常从各大视频平台下载视频的朋友来说&#xff0c;将特定格式的视频转换为更通用的格式&#xff0c;如MP4&#xff0c;变得尤为重要。其中&#xff0c;qsv格式的视频转换就是一项常见的…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...