Java并发的笔记

news2024/9/24 9:26:51

打算记录自己的学习情况,尽量不摆烂,另外一件事要有始有终,要弄完

如果多个线程处理同一个变量,读跟写都保证不了

2024.7.22》》》》》》》》》》》》

2.1.1volatile的实现原理

volatile不会引起线程上下文的切换和调度

一致性更新:处理器修改完某个变量会告诉其他处理器让它们更新最新版本的值,保证信息的一致

排他锁:某个处理器获得锁,就不让其他处理器操作这个变量。就是synchronized保证写后读,这不是2.1的重点

volatile能保证,当一个处理器写了某个被volatile修改的数据,其他处理器能正确的读到被修改后的值,就是保证读的正确

(小明):那写呢?不保证了?

不保证了,所以要充分理解volatile和syronchized,让它们各司其职,只盲目使用syronchized就有性能的大问题

内存屏障:屏障屏障,反正就是不让访问。内存的某个变量根据操作系统的某个约定使得在做一些处理变量的时候不让别人访问。可能有一个int version = 1;如果1就让访问,0不让访问

反正就是不让访问了。我感觉呢,应该屏障也是通过锁了去那个变量的导线,导致后面所有想访问这个变量,都得等着这根线没人用才可以。嗯,这也是锁的底层原理

缓冲行,跟cache沾边。当多个处理器操作缓存时会走一根大导线。处理器发送任何指令都是电压传输,如果2个处理器同时发命令两个电压造成电压叠加必定会造成混乱,最好情况就是其中一个处理器的指令执行被吃了(这也很恐怖),如果两个电压抵消,两个处理器的指令白干活。所以通过一些方法(应该也是锁),我走这根线你就先别走了,你在我后面,等我执行完你再执行。

缓存行由多个缓存线组成,如果某个处理器操作某个缓存线,别的处理器你就先等会。排队才有规则性

原子操作:要么都成功要么都失败,打游戏辛苦几个小时最后一步没存档。都回滚到存档开始数据重新打。这里侧重于某些指令希望一块都执行完并且不能有错

缓存行填充,缓存拿需要的变量时会去内存读,但是会一口气加载一个缓存行,也就是缓存行有64bit但是想要的变量就8bit,它会把剩下的56bit根据那个变量地址后面加载56bit。这个策略可能是好事,比如long[]  数组一口气没准都加载进去了。但是如果有a变量和b变量都需要操作,且b变量的操作要在a变量操作后执行,那就坏了,b和a绑在一块完全没法弄。所以希望某些操作的变量的bit很大。比如boolean。它放进去64bit占满了。

缓存行填充就是读内存地址会一口气加载一个缓存行的大小,64bit,32bit。然后某些变量可能有顺序关系,所以进行优化把一些关键的变量bit变的很大甚至填满

缓存命中:缓存离cpu近,内存离cpu远,如果缓存就有内存的数据就操作缓存而不是操作内存数据

写命中:首先,由于缓存命中,cpu会更“青睐”缓存行,跟缓存行打交道。操作完的数据写回缓存行。写了蛮多数据后,根据程序缓存行会把数据给内存的数据,缓存行再等着cpu继续操作数据。这也是计算机的理想操作数据场景

写缺失:当缓存行想往回更新内存数据时,内存的那块变量区域没了。迷失的孩子找不到回去的路。这就是写缺失。比如内存变量是一个即将垃圾回收的没用变量,操作这个变量更新内存数据时,已经被jvm回收,‘死了’,那就写缺失了。或者无法更新数据,已经到了家门口但是家里人不给你开门,也会写缺失

可见性:多个线程对同一个变量进行修改,能读到其他处理修改之后正确的数据

可见性 = volatile干的活 = 一致性更新 = 某个变量被处理器写后,其他处理器会嗅探到新数据并重新读新数据的值。

保障读,不保障写

这里在讲啥呢?

录制_2024_07_22_21_53_12_901

哇趣,上传视频后简直糊到爆炸,家人们先凑活看吧。后面有办法我再补回来

这里都能看懂了,重点是理解清楚视频,这里的‘嗅探’,‘一致性’。都是刚刚讲的清楚明白的概念。

在这里,通过某个处理器修改更新值后,其他处理器马上放弃自己处理的值重新读值再处理。这也是有些写后读的思想(其实整本书全部都是为了实现写后读,就是怎么实现的了)

2.1.2volatile的优化

其实就是刚刚讲的缓存行填充,8bit的东西结果后面56bit全放进去了,万一中间有一些逻辑。那就完了。所以防止这种情况干脆把关键需要的变量放大甚至占满。

2.2synchronized原理

锁方法,锁的是实例化的对象。

锁静态方法,锁类

锁方法块,锁对于锁的那个对象

通过读取对象头的信息知道是不是要上锁,上什么锁。

知道要上锁后,就用monitor对象锁东西。分成monitorenter和monitorexit两个对象放到开始和结束

家人们,觉得写的好就用去大厂的无敌代码小手点个赞,俺看到了会觉得自己做到事是有意义的,会更有决心更完。评论收藏都可以

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《0基础》学习Python——第十八讲__爬虫/<1>

一、什么是爬虫 爬虫是一种网络数据抓取的技术。通过编写程序(通常使用Python),爬虫可以自动化地访问网页,解析网页内容并提取出所需的数据。爬虫可以用于各种用途,如搜索引擎的索引,数据分析和挖掘&#x…

【中项】系统集成项目管理工程师-第4章 信息系统架构-4.7安全架构

前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…

软件测试---测试需求分析

课程目标 什么是软件测试需求 软件测试需求的必要性 如何对软件测试需求进行分析(重点) 课程补充 灰度测试(基于功能):先发布部分功能,然后看用户的反馈,再去发布另外一部分的功能更新。 A/B测…

Qt绘制指南针(仪表盘绘制封装使用)

指南针是一种用来确定方向的工具。它由一个磁针制成,其一端被磁化,可以自由旋转。当放置在水平面上时,磁针会指向地球的磁北极。通过观察磁针的指向,我们可以确定地理北方的方向。本示例是在Qt中绘制一个指南针,通过继…

基于springboot+vue+uniapp的宿舍管理系统小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

C++学习笔记02-结构基础(问题-解答自查版)

前言 以下问题以Q&A形式记录,基本上都是笔者在初学一轮后,掌握不牢或者频繁忘记的点 Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系,也适合做查漏补缺和复盘。 本文对读者可以用作自查,答案在后面&#xff0…

Git的使用教程

仓库分区 Git本地有三个工作区域:工作目录(Working Directory),暂存区(Stage/Index),资源库(Repository或Git Directory)。如果再加上远程的git仓库(Remove Directory)就…

SAP PP 物料主数据字段状态控制

参考 https://zhuanlan.zhihu.com/p/452823415 物料主数据里面的状态 由 1、行业 2、工厂 3、物料类型 4、事务代码 5、采购相关字段 6、客制 优先级 隐藏->显示->必输->可选

Go基础编程 - 11 - 函数(func)

接口(interface) 函数1. 函数定义1.1. 函数名1.2. 参数列表1.3. 返回值列表 2. 匿名函数3. 闭包、递归3.1 闭包3.1.1 函数、引用环境3.1.2 闭包的延迟绑定3.1.3 goroutine 的延迟绑定 3.2 递归函数 4. 延迟调用(defer)4.1 defer特…

C语言中的控制语句(三):while 和 do while 语句

文章目录 [toc] 🍊自我介绍🍊while语句🍊do...while循环🍊🍊 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ 🍊自我介绍 Hello…

单调栈(随缘复习到了,顺手刷了)

也是不知道为什么突然又复习到单调栈了,所以顺手刷了三道题,总结一下 P6503 [COCI2010-2011#3] DIFERENCIJA 思路:这题是要求每个子区间里面的最大值和最小值的差,我们一开始想的必然是纯暴力呀,但是一看这数据&#…

主流硬派SUV齐聚尼三锅,方程豹豹5成功冲顶

随着汽车的飞速普及,越来越多的车主都喜欢上了越野。 而在浩瀚无垠的沙漠腹地,尼三锅以其独特的地理形态,成为了无数越野爱好者心中的圣地与试炼场。 近日,众多汽车博主携自己的爱车普拉多、方程豹豹5、牧马人、坦克400、坦克700、…

图书馆座位管理系统 /图书馆座位预约系统/图书馆管理系统的设计与实现

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…

excel批量新建多个同类型的表格

背景引入 比如,一个企业有多个部门,现在需要按照某一个excel表模板收集各个部门的信息,需要创建数十个同类型表格,且标题要包含部门名称。 1.修改模板表格标题 在一个文件夹下面放入需要发放给各个部门的表格,将标题…

轨迹优化 | 基于ESDF的共轭梯度优化算法(附ROS C++/Python仿真)

目录 0 专栏介绍1 数值优化:共轭梯度法2 基于共轭梯度法的轨迹优化2.1 障碍约束函数2.2 曲率约束函数2.3 平滑约束函数 3 算法仿真3.1 ROS C实现3.2 Python实现 0 专栏介绍 🔥课程设计、毕业设计、创新竞赛、学术研究必备!本专栏涉及更高阶的…

Chapter17 表面着色器——Shader入门精要学习

Chapter17 表面着色器 一、编译指令1.表面函数2.光照函数3.其他可选参数 二、两个结构体1.Input 结构体:数据来源2.SurfaceOutput 三、Unity背后做了什么四、表面着色器的缺点 一、编译指令 作用:指明该表面着色器的 表面函数 和 光照函数,并…

LeetCode 58.最后一个单词的长度 C++

LeetCode 58.最后一个单词的长度 C 思路🤔: 先解决当最后字符为空格的情况,如果最后字符为空格下标就往后移动,直到不为空格才停止,然后用rfind查询空格找到的就是最后一个单词的起始位置,最后相减就是单词…

前台文本直接取数据库值doFieldSQL插入SQL

实现功能:根据选择的车间主任带出角色。 实现步骤:OA的“字段联动”功能下拉选项带不出表“hrmrolemembers”,所以采用此方法。 doFieldSQL("select roleid from HrmResource as a inner join hrmrolemembers as b on a.id b.resource…

AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理

AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理 一、简单介绍 二、Transformer 1、模型架构 2、应用场景 3、Hugging …

Flink架构底层原理详解:案例解析(43天)

系列文章目录 一、Flink架构(掌握) 二、Flink代码案例(掌握) 三、UDF(熟悉) 四、Flink常见面试题整理 文章目录 系列文章目录前言一、Flink架构(掌握)1、系统架构1.1 通信&#xff…