并发编程_jmm部分

1. JMM 理解

前提:并发编程有3大问题,可见性、有序性、原子性。
导致可见性的原因是缓存,有序性的原因是 编译器优化。解决方法就是直接禁用缓存和编译器优化,导致程序性能堪忧。
因此合理的方案就是按需禁用缓存和编译器优化。

所以: java 内存模型针对在多线程环境下,可见性 有序性制定了一些规范,在jvm 层面 提供按需禁用缓存和编译优化的方法。具体就是使用synchronized,volatile,final三个关键字和Happens-before 规则。 解决并发编程中 的代码的有序性和可见性。

long double 32位原子性问题。

3
如果需要保证 long 和 double 在 32 位系统中原子性,需要用 volatile 修饰

load load 两个连续的读不要重排序 防止读跑上去

防止 B 的 Load 重排到 A 的 Load 之前

if(A) {LoadLoadreturn B
}read(A)
LoadLoad
read(B)
  • 意义:A == true 时,再去获取 B,否则可能会由于重排导致 B 的值相对于 A 是过期的
    3

loadstore 防止连续 读写 防止写跑上去。

3

Acquire 第一个是load,防止后续的 读、写 不要重排序

同一线程内,读 操作之后的的读写,上不去,同时第一个load能读到主存中的最新值。
3

store store 连续的写 防止写跑下来

  • 防止 A 的 Store 被重排到 B 的 Store 之后
A = x
StoreStore
B = true
  • 意义:在 B 修改为 true 之前,其它线程别想看到 A 的修改
    • 有点类似于 sql 中更新后,commit 之前,其它事务不能看到这些更新(B 的赋值会触发 commit 并撤除屏障)
      3

release 防止读和写 跑下来。 ss ls

同一线程内,写操作之前的 , 读写下不来,后面的store 都能将改动的 都写入主存。
store store
load sore
防止上面的 读操作 写操作,被重排序到 写操作下面
3

store load ** 发生在线程切换时有效。 保证可见性。

sotre load 屏障 在线程切换时,保证可见性。

意义:屏障前的改动都同步到主存,屏障后的 Load 获取主存最新数据

  • 防止屏障前所有的写操作,被重排序到屏障后的任何的读操作,可以认为此 store -> load 是连续的
  • 有点类似于 git 中先 commit,再远程 poll,而且这个动作是原子的
    3

2.volatile 本质

写变量时 加 loadstore store store 屏障 和 store load 屏障

红色 蓝色是两个线程。
a

读取变量时 load load ,load store

在变量加入load load load store 屏障
3

1. 保证单一变量赋值的原子性

32 位操作系统,long double

2. 保证变量的有序性

线程内通过内存屏障保证有序,线程切换按照happen-before 有序。

partial ordering

total ordering

3. 可见性

线程切换时 ,发生了写->读,则变量可见,顺便影响普通变量可见性。
在volatile 变量 加入store load 屏障。
红色线程的写入同步到主存,然后让蓝色线程的读取,取主存中读取最新值。
3

3. Synchronization order

线程内部的一个顺序

4.happen-before 原则

在线程切换时,代码的顺序 和可见性。

表达的是,前一个线程的操作的结果 对后续线程的操作是可见的。

线程启动 和运行边界

线程1 启动线程2前对共享变量进行修改,在线程2运行时,读取共享变量一定能看到修改。
3

线程的结束 和join 的边界。

线程1 结束前,对共享变量的修改。t2线程等待t1线程的解释 join,t2也能读取到共享变量的读取。

线程的打断 和得知线程的打断。

interrupt
t1线程修改共享变量,t1线程对t2线程打断,t2线程得知打断,能够读取到共享变量的改变。
3

unlock 和lock 边界。

t1线程解锁前对共享变量的修改,t2线程加锁后,能够读取到共享变量的修改。

volatile 对变量的写 和volatile 的读 的边界

传递性

如果a hb b,
b hb c,
那么有a hb c

5. cas 原理

使用乐观锁机制,保证变量读写的原子性。
volatile+ cas 实现原子 可见 有序
volatile 搭配cas 保证 共享变量的可见性。
线程数小于cpu 核心数,乐观锁性能高。

aqs 的state 使用volatile

cas + volatile 保证 state 的最新值 和 互斥。

concurrenthashmap 懒惰初始化

有一个sizectl 属性,volatile 修饰,保证可见性。
在第一次 put 时,检查sizectl,使用cas 把 0 改成 -1, (-1,hash表正在被初始化),
其他线程来 初始化 cas 失败,不会重复创建了。

6. synchronized

有序性

3
在monitor enter 和 monitor exit 加了相应的屏障,
保证了 同步代码块 内部的代码,共享变量的读写, 不会重排序到同步代码块的外面。
强调 :
但是 在同步代码块内部还是会存在重排序的。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ATFX国际:大非农数据来袭,美国劳动力市场需求或空前旺盛

ATFX国际:昨日晚间公布的ADP数据震惊市场,新增就业人口高达49.7万人,而预期值仅为22.8万人,前值也只有26.7万人。公布值约为预期值和前值的总和。 ▲ATFX图 ADP数据是非农就业报告的前瞻指标,前者表现亮眼&#xff0c…

【算法集训之线性表篇】Day 01

文章目录 题目知识点补充思路分析代码实现运行结果 题目 01.从顺序表中删除具有最小值元素(假设唯一)并返回被删元素的值。空出位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。 知识点补充 顺序表的特点是逻辑…

Handshake failed due to invalid Upgrade header: null 解决方案以及连接60s,信息不交互,连接断开

Handshake failed due to invalid Upgrade header: null 解决方案以及连接60s,信息不交互,连接断开 1. 问题背景:因为后端用了nginx代理,所以websocket连接的过程中报错:Handshake failed due to invalid Upgrade hea…

Elasticsearch:跨集群复制应用场景及实操 - Cross Cluster Replication

通过跨集群复制(Cross Cluster Replication - CCR),你可以跨集群将索引复制并实现: 在数据中心中断时继续处理搜索请求防止搜索量影响索引吞吐量通过在距用户较近的地理位置处理搜索请求来减少搜索延迟 跨集群复制采用主动 - 被…

HTML5+CSS3+JS小实例:背景动态变化的登录界面2.0

实例:背景动态变化的登录界面2.0 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" con…

Chapter 4: Functions | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介FunctionsFunction callsBuilt-in functionsType conversion functionsMath functionsRandom numbersAdding new functionsDefinitions and usesFlow of executionParameters and argumentsFruitful functions and void functionsWhy fun…

【广州华锐互动】VR地铁安全应急疏散模拟演练系统

VR地铁安全应急疏散模拟演练系统是一种利用虚拟现实技术模拟铁路安全事故的应用程序。该系统具有以下功能和内容&#xff1a; 多种场景和情境&#xff1a;用户可以选择不同的场景和情境进行模拟&#xff0c;例如列车脱轨、火灾、爆炸等。 操作控制器或手势识别技术&#xff1…

TypeScript 中【类型断言】得使用方法

类型断言的概念 有些时候开发者比TS本身更清楚当前的类型是什么&#xff0c;可以使用断言&#xff08;as&#xff09;让类型更加精确和具体。 类型断言&#xff08;Type Assertion&#xff09;表示可以用来手动指定一个值的类型。 类型断言语法&#xff1a; 值 as 类型 或 <…

2.3 Web应用 -- 2. HTTP 连接

2.3 Web应用 -- 2. HTTP 连接 HTTP连接的两种类型非持久性连接响应时间分析与建模持久性HTTP HTTP连接的两种类型 非持久性连接(Nonpersistent HTTP) 每个TCP连接最多允许传输一个对象HTTP 1.0版本使用非持久性连接 持久性连接(Persistent HTTP) 每个TCP连接允许传输多个对象H…

Dubbo hystrix 熔断降级 详细示例 多服务 公共api

目录 介绍 demo-api pom 目录 代码api provider 服务提供者 目录 pom 服务实现代码 启动代码 配置 日志 consumer 消费者 目录 pom 调用service接口 调用serviceImpl类 ctr 配置 页面调用熔断效果 相关文章 介绍 因为网上和官网拷贝的文档发现有很多版本…

PyQt如何查找帮助信息(不会写组件的代码,快看过来!)

1.可以在PyQt6官网中查找信息kReference Guide — PyQt Documentation v6.5.1 看不懂没有关系啦&#xff0c;可以使用网页翻译哒~ 找到或者直接搜索QLabel&#xff0c;寻找对应函数即可 2. https://zetcode.com/pyqt6/ 3.Qt Creator中寻找 例如&#xff0c;输入setText 就可以…

el-table 添加合计,合计某一列

效果图&#xff1a; 1. 使用elementui 官网上的方法 如果是只要是数值&#xff0c;就要合并&#xff0c;就只设置show-summary 即可。 2. html&#xff1a; <!--cell-style 改变某一列行的背景色 --><!-- tree-props 配置树形子表row-click: 单击事件highlight-cu…