您现在的位置是:首页 > 正文

JAVA多线程的初级认识2-线程安全性

2024-02-29 16:22:47阅读 0

线程安全性是一个麻烦的难题~从而造成了多线程代码的难写的重要原因。那就从物理和JMM两个层面去了解安全性是如何出现问题的。

  • 物理层面

由于计算机设备的计算能力不均,大致可分为,IO设备 < 内存  < CPU,由于计算能力相差太大。导致很多的地方需要用到缓存,大致的缓存模型如下:

一级缓存L1:包含数据缓存和指令缓存

二级缓存L2:   各个CPU私有

三级缓存L3:    各个CPU共有

有了缓存,就需要保持缓存和缓存之间,缓存和元数据之间保持一致,从图上来看要么使用总线锁(消耗过大),要么使用缓存所,而缓存锁的实现就是通过缓存一致性协议。最常见的就是MESI(Modified, Exclusive, Shared, Invalid)。简单介绍下:

  1. M(Modify) 表示共享数据只缓存在当前 CPU 缓存中, 并且是被修改状态,也就是缓存的数据和主内存中的数 据不一致

  2. E(Exclusive) 表示缓存的独占状态,数据只缓存在当前 CPU 缓存中,并且没有被修改

  3. S(Shared) 表示数据可能被多个 CPU 缓存,并且各个缓 存中的数据和主内存数据一致

  4. I(Invalid) 表示缓存已经失效

在 MESI 协议中,每个缓存的缓存控制器不仅知道自己的 读写操作,也要监听其他缓存的操作。然后通过协议去更改自己缓存中数据的状态从而保证一致性。但是这样就带来了新的弊端,由于CPU速度最快,如果需要同步等待其他缓存控制器更新完了缓存ACK之后才能够进行下面操作指令的话,又会浪费CPU资源。所以,有引入了StoreBuffer机制。

StoreBuffer的生成是采用了异步的方式,即CPU处理完工作更新缓存之后就进行后面的工作,不管你缓存控制器是否完成相应的更新,缓存控制器只是发送缓存更新的消息,至于其他的缓存控制器的ACK完全是异步的。但是这样就又引入了一个问题,就是异步数据的不可控问题。不知道指令A和指令B谁先谁后完成,从而造成数据的不可控。

  • JMM

java memory model内存模型如下:

各个线程的工作内存更新而不及时刷新到主内存,而另外一个工作内存不能及时通过主内存的到最新的值而进行操作,最后刷新到主内存中,造成了数据的覆盖~从而造成了线程安全问题。

网站文章

  • C语言(十七)链表

    一、算法        通俗定义:            解题的方法和步骤        狭义定义:            对存储数据的操作            对不同的存储结构,要完成某一个功能所执行的操作时不一样的            比如:               要输出数组中所有的元素的操作和               要输出数组中所有元...

    2024-02-29 16:22:32
  • AI 时代,程序员无需焦虑

    AI 时代,程序员无需焦虑

    当一个问题被明确并拆解到软件项目维度的时候,面对确定的任务、清晰的目标、合理的架构,可以解决问题的人就非常多了,AI 自然也才有用武之地。大型软件系统,本身往往具有较高的复杂度。如果把你放到陌生的小区...

    2024-02-29 16:22:24
  • windows10文件服务器,windows10文件服务器

    windows10文件服务器,windows10文件服务器

    windows10文件服务器 内容精选换一换华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。本文以云...

    2024-02-29 16:21:56
  • Linux常用150个命令

    常用Linux操作做指令

    2024-02-29 16:21:48
  • python的__name__属性详解

    python的__name__属性详解

    有关文件导入: 一个独立的python文件就是一个模块 在导入文件时,文件中 所有没有任何缩进的代码都会被执行一遍 在实际开发中,开发人员通常会在模块下方增加一些测试代码,测试代码是仅在模块内使用,而被导入到其他文件中不需要执行 这里就需要知__name__属性 __name__属性可以做到,测试模块的代码只在测试情况下被运行,而在被导入时不会被执行 __name__时python的一个内置...

    2024-02-29 16:21:41
  • 一篇文章让你弄懂二分查找

    一篇文章让你弄懂二分查找

    首先,我们要聊一下什么是二分查找,二分查找只适用于有序表,举个例子,一个元素1-10的数组,我要你找到元素7所在的位置,通过我们人眼观察,你可能一下子就可以找到。此时,我们要找的元素7比mid下标所指...

    2024-02-29 16:21:12
  • 第一章 动态网页基础

    第一章 动态网页基础

    本章简介     通过学习的JavaSE、Web前端等方面的技术,从本章开始,将结合之前所学内容,逐步接触用用的Web系统开发。本章将从动态页面和静态页面的区别说起,介绍Web应用系统的工作原理。大家...

    2024-02-29 16:20:58
  • 朝戈《敏感者》

    朝戈《敏感者》

     朝戈《敏感者》  1986年,朝戈回到他求学四年的母校,这次,他是以一名教师的身份进入中央美术学院的。 20世纪90年代在不知不觉中悄然来临了。美术学院的高墙虽然挡住了市井的喧闹,但激烈的社会变革气息透过墙角的隙缝吹进了校园。这种躁动的情绪影响了朝戈。 中央美术学院教授 朝戈:这个时代

    2024-02-29 16:20:30
  • 深度学习论文分享(八)Learning Event-Driven Video Deblurring and Interpolation

    深度学习论文分享(八)Learning Event-Driven Video Deblurring and Interpolation

    暂无??在此仅做翻译基于事件的传感器在像素强度变化超过触发阈值时具有响应,可以以微秒级精度捕获高速运动。在事件相机的辅助下,我们可以从低帧率的模糊视频中生成高帧率的清晰视频。本文提出了一种有效的基于深...

    2024-02-29 16:20:22
  • java-面向对象中级-习题(设计父类子类一打印学生和老师的基本信息)

    java-面向对象中级-习题(设计父类子类一打印学生和老师的基本信息)

    题目代码Homework13 main classpackage com.hspedu.homework.homework13;public class Homework13 { public ...

    2024-02-29 16:20:15