并发前置知识二:多线程不安全的本质

一、前言

这些年,我们的cpu、内存和i/o设备都在不断迭代,不断朝着更快的方向努力。但是,在这个快速发展的过程中,有一个核心矛盾一直存在,就是这三者的速度。

  1. cpu是天上1天,内存是地上1年
  2. cpu是天上1天,io是地上10年

为了合理利用cpu的高性能,平衡这三者的速度差异,计算机系结构、操作系统、编译程序都做出了贡献,主要体现为:

  1. cpu加了缓存,以均衡与内存的速度差异
  2. 操作系统增加了进程、线程,以时分复用cpu,进而均衡cpu与i/o设备的速度差异
  3. 编译程序优化指令执行次序,使得缓存能够更加合理的利用

二、造成的问题

1.缓存导致的可见性问题

在多核cpu时代,每个cpu都有自己的缓存,cpu1对于缓存的操作对于cpu2是不可见的,所以当cpu2对某一个值处理时,是不知道别的cpu对它的更改的,所以会有可见性问题

2.线程切换带来的原子性问题

java并发程序是基于多线程的,多线程自然就涉及任务切换,比如一条 count+1=1, 至少需要三条cpu指令

  1. 指令1: 首先,需要把变量count从内存加载到CPU的寄存器
  2. 指令2: 之后,在寄存器中执行+1的操作
  3. 指令3: 最后,把结果写入到内存中(缓存机制导致可能写入的是cpu缓存而不是内存)

image.png
cpu保证的是cpu指令是原子的,但是高级语言的指令不会是原子操作。一条高级语言的操作往往对于多条cpu指令,如果想解决这种原子性的问题,大多要使用🔒。

3.编译优化带来的有序性问题

通过一个双重检查创建单例对象来说明这个编译优化带来的问题:

public class Singletion{
  static Singleton instance;
  static Singletion getInstance(){
      if (instance == null ){
          synchronized(Singleton.class){
              if(instance == null)
                  instance = new Singletion();
          }
      }
  }
}

我们理想的情况是:

  1. 线程A和线程B同时执行getInstance方法,线程A先进入获取到锁之后,然后开始创建Singleton对象,线程B后来进入,没有拿到锁,然后阻塞起来。
  2. 等线程A创建完对象,释放锁之后线程B 判断 instance== null时发现,已经创建过来,就不会再创建了

but:这里问题出现在了 newSingleton上,new Singleton会出现先释放引用,然后再分配内存的指令重排序,如果刚好在这个时候,内存还没来的分配好,就发生了线程切换,线程B 判断instance == null 为false,就返回了,但是真正去获取成员变量的时候,就会发生空指针,因为成员变量内存还没有分配好。

三、如何解决这些问题

java提供了很多关键字(sync、final、volatile)来按需禁用缓存、按需禁用编译优化。

1.解决可见性

volatile、sync这些解决可见性本质上就是通过内存屏障保证对于工作内存的修改或者读取都直接作用于主内存

2.解决原子性

volatile并不具备原子性,只是在32位机器上对于Long类型的读写保证原子性

要具备原子性,还是要有锁,要有临界区的概念,要让一组操作一起。sync里面的操作都是具有原子性的。

3.解决有序性

volatile、sync都是通过内存屏障来解决有序性的问题

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

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

相关文章

配电柜监测:别再人工巡检!一文讲透!

随着现代社会对电力的依赖性不断增强,各行各业对电力系统的可靠性和安全性提出了更高的要求。 配电柜作为电力系统的核心组成部分,其监控与管理显得尤为重要。为了满足企业对电力系统监测的需求,配电柜监控系统应运而生。 客户案例 制造企业…

ASP .net core微服务实战(杨中科)

背景: 主要是思考下,我们为什么要用微服务? 微服务我现在理解是:提供了我们一种模块化的手段,一个服务负责一种类型的业务,是一种面对复杂问题进行拆分的方式,但是也会引入一些中间件&#xf…

视频智能分析/边缘计算AI智能分析网关V4区域入侵检测算法如何配置?

边缘计算AI智能分析网关(V4版)部署了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,并上报识别结果,并能进行语音告警播放。算法配置后,即可对监控视频流进行实时检测&#xf…

2024.1.8 Day04_SparkCore_homeWork

目录 1. 简述Spark持久化中缓存和checkpoint检查点的区别 2 . 如何使用缓存和检查点? 3 . 代码题 浏览器Nginx案例 先进行数据清洗,做后续需求用 1、需求一:点击最多的前10个网站域名 2、需求二:用户最喜欢点击的页面排序TOP10 3、需求三&#x…

制造知识普及--MES系统中的调度排产管理

要想弄清楚MES系统调度排产的管理机制,则要首先搞清楚车间调度排产是一套怎样的工作流程,它的难点在什么地方? 生产调度指的是具体组织实现生产作业计划的工作,是对执行生产作业计划过程中发生的问题和可能出现的问题&#xff0c…

PingCAP 受邀参加 FICC 2023,获 Open100 世纪全球开源贡献奖

2023 年 12 月,2023 国际测试委员会智能计算与芯片联邦大会(FICC 2023)在海南三亚举办,中外院士和数十位领域专家莅临出席。 大会现场 ,开放源代码促进会创始人 Bruce Perens 颁发了 Open100 世纪全球开源贡献奖&…

WXUI 基于uni-app x开发的高性能混合UI库

uni-app x 是什么? uni-app x,是下一代 uni-app,是一个跨平台应用开发引擎。 uni-app x 没有使用js和webview,它基于 uts 语言。在App端,uts在iOS编译为swift、在Android编译为kotlin,完全达到了原生应用…

GPT Store,是否会成为下一个App Store?

经历了一场风波后,原本计划推出的GPT Store终于成功上线。OpenAI在北京时间1月11日推出了GPT Store,被广泛视为类似于苹果的"App Store",为人工智能应用生态系统迈出了重要一步。然而,OpenAI要想将GPT Store打造成苹果般…

vue知识-05

聊天室案例(django接口) # chat.hetm<<script src"/static/axios.js"></script><script src"/static/vue.js"></script><body> <div id"app"><h1>聊天室</h1><button click"handleS…

YOLOv8涨点改进:多层次特征融合(SDI),小目标涨点明显,| UNet v2,比UNet显存占用更少、参数更少

💡💡💡本文独家改进:多层次特征融合(SDI),能够显著提升不同尺度和小目标的识别率 如何引入到YOLOv8 1)替代原始的Concat; 💡💡💡Yolov8魔术师,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,轻松带你…

汽车级线性电压稳压器LM317MBSTT3G:新能源汽车的理想之选

LM317MBSTT3G是一款可调三端子正向线性稳压器&#xff0c;能够在 1.2 V 至 37 V 的输出电压范围内提供 500 mA 以上的电流。此线性电压稳压器使用非常简便&#xff0c;仅需两个外部电阻即可设置输出电压。另外&#xff0c;它采用内部电流限制、高温关断和安全区域补偿&#xff…

npm发布js函数库

直接上干货吧 首先进入npm官网注册账号下面会用到 1.新建文件夹例如 chengyu 2.cdm chengyu 3.npm init &#xff08;填写一些基本信息一直y就可以 后面可以直接修改文件&#xff09;结束之后多了一个package.json文件就是下面的样子 {"name": "brogramme…

多测师肖sir___ui自动化测试po框架讲解版

po框架 一、ui自动化po框架介绍 &#xff08;1&#xff09;PO是Page Object的缩写 &#xff08;2&#xff09;业务流程与页面元素操作分离的模式&#xff0c;可以简单理解为每个页面下面都有一个配置class&#xff0c; 配置class就用来维护页面元素或操作方法 &#xff08;3&am…

Spring Boot中加@Async和不加@Async有什么区别?设置核心线程数、设置最大线程数、设置队列容量是什么意思?直接在yml中配置线程池

在 Spring 中&#xff0c;Async 注解用于将方法标记为异步执行的方法。当使用 Async 注解时&#xff0c;该方法将在单独的线程中执行&#xff0c;而不会阻塞当前线程。这使得方法可以在后台执行&#xff0c;而不会影响主线程的执行。 在您提供的代码示例中&#xff0c;a1() 和…

【深蓝学院】手写VIO第11章--Square Root Bundle Adjustment

文章目录 1. 文章贡献2. 在Jacobian中添加 d a m p \sqrt{damp} damp ​等价于在Hessian中添加damp2. Givens旋转3. Jacobian推导4. Refernece 1. 文章贡献 这篇文章最大的贡献在于证明了对 J l Jl Jl进行QR分解&#xff0c;对normal equation左乘 Q T Q^T QT等价于Schur comp…

创建 SSL证书并应用于WebSocket

写在前面 由于上一篇介绍 如何使用Fleck创建WebSocket服务器 &#xff0c;感觉不够完善&#xff0c;因为生产环境中肯定是需要用到ssl的&#xff0c;而创建或申请ssl证书&#xff0c;相对而言是比较繁琐的事情&#xff0c;特别是本地如果要构建一个使用ssl的测试环境时&#x…

记录一次数据中包含转义字符\引发的bug

后端返回给前端的数据是: { "bizObj": { "current": 1, "orders": [ ], "pages": 2, "records": [ { "from": "1d85b8a4bd33aaf99adc2e71ef02960e", …

【办公技巧】Word功能区灰色显示不能编辑,怎么破?

Word文档可以设置加密来保护文件禁止修改&#xff0c;但是在word文档中设置限制编辑功能时对它的作用是否有详细的了解呢&#xff1f;今天为大家介绍word限制编辑功能的作用以及忘记了限制编辑密码该如何解决。 设置限制大家应该都清楚&#xff0c;就是点击工具栏中的审阅 – …

如何让GPT/GPT4成为你的编程助手?

详情点击链接&#xff1a;如何让GPT/GPT4成为你的编程助手&#xff1f; 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二…

Edge扩展插件安装

目录 一、 Edge扩展插件安装步骤 1.1 打开 Edge 浏览器&#xff0c;并点击右上角的菜单按钮&#xff08;三个水平点&#xff09;。 1.2 在菜单中选择“扩展”选项。 1.3 在扩展页面通过“查找新扩展”来找到你想要安装的扩展插件。 ​编辑 1.4 搜索插件 1.5 在详情页面中…
最新文章