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

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

  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可能未初始化)

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot宠物领养管理系统计算机毕业设计源码46534

摘 要 网络发布信息有其突出的优点,即信息量大,资源丰富,更新速度快等,很符合人们希望以捷、便利的方式获得最多最有效信息的要求。本系统就是一个网上宠物领用的系统,为宠物爱好者提供一个信息发布的平台&#xff0c…

C++三角函数和反三角函数的使用

注意C中三角函数使用的是弧度制(3.14) 。示例图中角为30度 sin(30/180*PI);//已知角度,求正弦 cos(30/180*PI);//已知角度,求余弦 tan(30/180*PI);//已知角度,求正切asin(a/c);//已知正弦值,求弧度 acos(b/c);//已知余弦值&#x…

html和css创建一个简单的网页

html代码及解析 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>CSS Example</title><lin…

android studio CreateProcess error=2, 系统找不到指定的文件

【问题记录篇】 在AndroidStudio编译开发jni相关工程代码的时候&#xff0c;编译遇到的这个报错&#xff1a; CreateProcess error2, 系统找不到指定的文件。排查处理步骤: 先查看Build Output的具体日志输出 2.了解到问题出在了NDK配置上&#xff0c;此时需要根据自己的gra…

Vue3【十九】自定义Hooks钩子 将数据和方法分组

Vue3【十九】自定义Hooks钩子 将数据和方法分组 Vue3【十九】自定义Hooks钩子 将数据和方法分组 每个分组都可以放置 各种生命周期钩子 分组和可以使用计算属性等 案例截图 目录结构 代码 person.vue <template><div class"person"><h2>Vue3自定…

C++中的结构体——结构体指针

作用&#xff1a;通过指针访问结构体中的成员 利用操作符 -> 可以通过结构体指针访问结构体属性 示例 运行结果

『大模型笔记』Anthropic团队:什么是大模型的可解释性!

Anthropic团队:什么是大模型的可解释性! 文章目录 一. Anthropic团队:什么是大模型的可解释性!二. 参考文献我的小红书中英文双语视频:Anthropic团队:什么是大模型的可解释性!一. Anthropic团队:什么是大模型的可解释性! 我在Anthropic的可解释性团队工作。可解释性是…

诊所管理系统软件的特征有哪些

在医疗行业快速迈进数字化时代的背景下&#xff0c;诊所管理系统的出现&#xff0c;为诊所的管理和服务模式带来重大变革&#xff0c;不仅极大地提升了工作效率&#xff0c;还显著增强了患者的就医体验&#xff0c;为医疗体系的全面升级注入了新的活力。 首先&#xff0c;来和大…

Vue23-过滤器

一、效果图 二、好用的时间戳三方工具 该三方工具比较大 推荐使用 dayjs的用法&#xff1a; 三、过滤器的使用 3-1、计算属性实现 3-2、methods函数实现 3-3、过滤器filters属性实现 过滤器的本质就是函数&#xff01;&#xff01;&#xff01; 1、过滤器-未传参 默认将管道…

售后服务体系认证的优势与意义

在现代商业环境中&#xff0c;售后服务已经成为企业与客户建立长期关系的重要桥梁。售后服务体系认证不仅是对企业服务能力的认可&#xff0c;更是提升企业竞争力的关键手段。本文将详细阐述售后服务体系认证的优势与意义&#xff0c;探讨其对企业和客户的积极影响。 优质的售后…

init函数

【1】init函数&#xff1a;初始化函数&#xff0c;可以用来进行一些初始化的操作 每一个源文件都可以包含一个init函数&#xff0c;该函数会在main函数执行前&#xff0c;被Go运行框架调用。 【2】全局变量定义&#xff0c;init函数&#xff0c;main函数的执行流程&#xff1f…

解决While loop问题 - Python

当我们在使用 while 循环时&#xff0c;需要确保循环的终止条件最终会被满足&#xff0c;否则循环将会无限执行下去。通常情况下&#xff0c;我们可以在循环内部修改循环控制变量&#xff0c;使得终止条件得以满足。 1、问题背景 一位开发者在使用 Python 开发一个基于文本的游…

【Linux】Linux基础文件与目录管理:成为Linux大师的入门必修课

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、Linux文件与目录的基本概念二、常用文件与目录管理命令1. ls&#xff1a;列出目录内容2. cd&#xff1a;更改当前工作目录3. pwd&#xff1a;显示当前工作目录4. mkdir和rmdir&#xff1a;创建和删除目录5. touch&a…

西门子学习笔记13 - mtqq库项目

这是我整合过后的mqtt库的下载地址 https://download.csdn.net/download/qq_61916672/89423266https://download.csdn.net/download/qq_61916672/89423266

几行代码实现多对多网格视图

当我们希望实现如下图所示效果如何实现呢: 我们可以使用Vis.js,vis.js Vis Network Examples Vis.js 是一个支持多种网络可视化的库,使用简单,功能强大。 以下是具体实现例子 不带箭头的: <!DOCTYPE html> <html> <head><meta charset="utf…

python3的基本语法说明三

一. 简介 前面几篇文章简单学习了 python3的基本语法&#xff0c;文章如下&#xff1a; python3的基本语法说明一-CSDN博客 python3的基本语法说明二-CSDN博客 本文继续学习 python3的基本语法。 二. python3 的基本语法 1. 等待用户输入 执行下面的程序在按回车键后就会…

stable diffusion中的negative prompt是如何工作的

https://stable-diffusion-art.com/how-negative-prompt-work/https://stable-diffusion-art.com/how-negative-prompt-work/https://zhuanlan.zhihu.com/p/644879268

java+vue3+el-tree实现树形结构操作

基于springboot vue3 elementPlus实现树形结构数据的添加、删除和页面展示 效果如下 代码如下&#xff0c;业务部分可以自行修改 java后台代码 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.daztk.mes.common.annotation.LogOperation…

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

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

【qt】视口和窗口坐标

视口和窗口坐标 一.视口和窗口坐标的原理二.视口和窗口坐标的好处三.演示好处四.总结 一.视口和窗口坐标的原理 在绘图事件中进行绘图 void Widget::paintEvent(QPaintEvent *event) {QPainter painter(this);QRect rect(200,0,200,200);painter.drawRect(rect);//设置视口的…