并发编程(三)原子性(2)

news2024/11/23 18:46:39

【 悲观锁与乐观锁 】:

【悲观锁】:

一定会被别人打断;我必须得上锁。synchronized就是悲观锁。

【乐观锁】:

乐观锁又称之为——无锁、自旋锁、CAS 。
厕所里的人认为不会有其他人来上厕所和我竞争。

【举例解释CAS操作】:

在这里插入图片描述
//还是拿多个线程访问 n++ 为例。
在这里插入图片描述
【往回写的时候要进行判断】:
判断是否依然为0(和拿之前的值一样),如果是,就说明中间没有线程来动它。
【如果发现不想等】:
判断的时候如果发现已经被改成8了,这个时候就得重新读 , 重新把8读过来,进行++操作,然后再去判断看一看是否依然是8,如此一直循环,直到有一次发现——没有其他线程修改,那么就成功了。

【CAS中的ABA问题】:

此0非彼0问题

其他线程修改数次最后值和原值相同。

//有些情况下,我们必须要解决ABA问题。——拿的是引用类型的话,引用指向的内容变化了。
【解决方法】:
加上一个version即可。规定任意的操作都会让这个version的值加加。

【版本的类型】:

(1)带时间戳 / 带数字
(2)布尔类型

【CAS的底层原子性保障】:

compare and swap
CAS操作本身必须得是原子性的才可以。
比如:
if( 变量==原先 ){
修改变量的值; //进行到这一步的时候,有一个线程把值改成了8,但已经过了判断,此时就只能把8改成1了。
}

【 Atomic类深入认识CAS 】:

/**
 * 解决同样的问题的更高效的方法,使用AtomXXX类
 * AtomXXX类本身方法都是原子性的,但不能保证多个方法连续调用是原子性的
 */
package T05_YuanZiXing;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class T00_03_AtomicInteger {
	/*volatile*/ //int count1 = 0;

	AtomicInteger count = new AtomicInteger(0);

	/* synchronized */void m() {
		for (int i = 0; i < 10000; i++)
			//if count1.get() < 1000
			count.incrementAndGet(); //count1++
	}

	public static void main(String[] args) {
		T00_03_AtomicInteger t = new T00_03_AtomicInteger();

		List<Thread> threads = new ArrayList<Thread>();

		for (int i = 0; i < 100; i++) {
			threads.add(new Thread(t::m, "thread-" + i));
		}

		threads.forEach((o) -> o.start());

		threads.forEach((o) -> {
			try {
				o.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		});

		System.out.println(t.count);

	}
}

【最终输出】:
在这里插入图片描述

【Hotspot理解CAS】:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
atomic这个类上的Linux实现 , X86架构下的 。

在这里插入图片描述
在这里插入图片描述
【94行】:
首先判断是不是MP , Multi-Processors , 你是不是多核的处理器 ,如果你是MP的话,前面加一条LOCK指令 ;
在这里插入图片描述
后面的汇编指令是cmpxchgl , CPU在底层的时候支持汇编指令cmpxchgl 。

最终实现:

cmpxchg = cas修改变量值

lock cmpxchg 指令

硬件:

lock指令在执行的时候视情况采用缓存锁或者总线锁。

【最终总结】:
如果你是多核的——加lock ;
不是多核的——直接cmpxchg指令即可。

【原子与否】:
cmpxchg指令这个不是原子的。———《汇编语言操作手册》

【得出的结论】:

CAS操作得益于CPU在汇编指令操作上支持cmpxchg指令。多核的话要在cmpxchg指令前加Lock指令。CAS底层还是使用了悲观锁,虽然叫“乐观锁”。

【 乐观锁 和 悲观锁 的效率比较 】:

【按使用场景比较】:

不同的场景:

临界区执行时间比较长 , 等的人很多 -> 重量级

时间短,等的人少 -> 自旋锁

【实现】:

和悲观锁关联的往往有一个队列;线程在队列里等着。——在队列里等着的那些线程是不消耗CPU资源的。
在这里插入图片描述
乐观锁是一圈一圈的自旋:
在这里插入图片描述
//一圈一圈的循环( 和原值进行比较 ),是需要消耗CPU资源的。

【CPU资源】:

乐观锁消耗的CPU资源更多一些。

【如何选择】:

执行时间长 , 排队的人又多————悲观锁。
执行时间短, 排队等待的人少—-——乐观锁。

【追求量化的话】:

自己去压力测试。

【实战选择】:

实战就用synchronized即可~

synchronized做了一系列的优化 , 在它内部既有自旋锁 ,偏向锁 , 重量级锁进行自适应的升级过程,它的效率已经升级的很不错了,自动完成锁升级过程。

【synchronized和三大特性 】:

【synchronized保障可见性】:

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

SOHO帮客户找新品,如何拿到最优价?要不要选择大型机械类产品?

做外贸&#xff0c;无论是贸易公司还是工厂&#xff0c;又或者是SOHO。都有机会帮助客户采购自己主打产品之外的其他产品&#xff0c;有些人就会问&#xff0c;对于客户咨询的新产品&#xff0c;我们本身没有熟悉的供应商&#xff0c;这个时候要怎么去找到好的供货商&#xff1…

世界技能大赛夺冠背后,亚马逊云科技如何培养云计算技能人才?

云计算相关专业的就业前景如何&#xff1f; 人社部数据显示&#xff0c;到2025年我国云计算人才缺口将高达近150万。另一方面&#xff0c;根据艾瑞咨询《中国云计算行业洞察与人才分析》报告&#xff0c;2019年云计算领域人才月均薪酬在1万元以上的占比达93.7%&#xff0c;3万元…

VK3606D抗电机马达干扰直接输出6键触摸芯片,电容式6通道触控检测IC低电平有效,无触摸4秒进入待机模式常用于工控面板/空调/风扇/家电等

VINKA/永嘉微电的VK3606D SOP16是一种具有自动校准功能&#xff0c;低待机电流&#xff0c;抗电压波动等特性的&#xff0c;6按键电容式触摸触控检测IC&#xff0c;适用于温控器&#xff0c;86面板触摸开关&#xff0c;智能家居等抗干扰场所 型号&#xff1a;VK3606D 封装形…

WebGL、GPU硬件加速、GLSL、光栅化

一、介绍 WebGL经常被当成3D API&#xff0c;人们总想“我可以使用WebGL和一些神奇的东西做出炫酷的3D作品”。 事实上WebGL仅仅是一个光栅化引擎&#xff0c;它可以根据你的代码绘制出点&#xff0c;线和三角形。 想要利用WebGL完成更复杂任务&#xff0c;取决于你能否提供合…

CentOS Stream 9 配置静态 IP

系统环境&#xff1a; OS&#xff1a;CentOS Stream 9 CentOS Stream 9 不同于以往版本的 CentOS&#xff0c;没有之前的网络设置相关的命令&#xff0c;如&#xff1a; service network start/restart/status systemctl start/restart/status network设置网卡 IP 的配置文件…

新媒体研究杂志社新媒体研究编辑部新媒体研究杂志2022年第18期目录

本期聚焦 出版学核心期刊自媒体运营状况与其学术影响力关系研究 程海燕;季佳乐; 1-5 理论研究 《新媒体研究》投稿&#xff1a;cnqikantg126.com 网络社群网民情绪感染研究综述 单悦影;祁凯; 6-922 基于CiteSpace的被遗忘权研究综述 徐怡; 10-14 应用研究 …

MCE | RNA 逆转录小提示

Tips 1&#xff1a;防止 RNA 模板的降解毫无疑问&#xff0c;RNA 质量对 cDNA 合成结果会产生重要影响。但 RNA 很脆弱&#xff0c;易于降解。为了保证 RNA 的完整性&#xff0c;我们需要小心又小心&#xff0c;比如在冰上操作&#xff0c;用 RNase-free 的枪头和离心管&#x…

力扣27.移除元素【顺序表】

&#x1f648;个人主页&#xff1a;阿伟t &#x1f449;系列专栏&#xff1a;【C语言–大佬之路】 &#x1f388;今日心语&#xff1a;你所看到的惊艳&#xff0c;都曾被平庸所历练。 前言&#xff1a; 在解题过程中一定要画图进行思考&#xff0c;然后再敲代码。 文章目录移除…

计算属性computed、过滤器定义Vue.filter()

计算属性是为了计算得到一个结果而设计的&#xff1b;放在Vue中computed里面定义&#xff1a;如果我们想在页面上打印一个变量&#xff0c;那就直接“{{变量}}”放在大括号里面&#xff0c;然后变量在data里面定义好初始值&#xff0c;就可以在页面上输出了&#xff0c;比如&am…

策略验证_指标买点分析技法_运用KDJ随机指标选择买点

写在前面&#xff1a; 1. 本文中提到的“股票策略校验工具”的具体使用操作请查看该博文&#xff1b; 2. 文中知识内容来自书籍《同花顺炒股软件从入门到精通》 3. 本系列文章是用来学习技法&#xff0c;文中所得内容都仅仅只是作为演示功能使用 目录 解说 策略代码 结果 解…

tftp服务配置的详细过程,简单快速

主机端编译的Linux内核影像必须有至少一种方式下载到目标板上执行。通常是目标板的引导程序负责把主机端的影像文件下载到内存中。根据不同的连接方式&#xff0c;可以有多种文件传输方式&#xff0c;每一种方式都需要相应的传输软件和协议。 在linux开发中最常用的传输方式为网…

打破汽车零部件企业供应链壁垒,数商云SCM供应链系统实现一体化采购协同

随着疫情反复&#xff0c;包括芯片在内的关键零部件短缺&#xff0c;以及原材料成本和物流费用飙升&#xff0c;使得零部件企业利润大幅压缩甚至亏损。当前&#xff0c;在亚洲、欧洲、北美等地&#xff0c;国际零部件厂商正迎来一波“破产潮”&#xff0c;汽车零部件企业举步维…

数据结构(4)树形结构——二叉树(概述、前序、中序、后序、层序遍历JAVA实现)

目录 4.1.树 4.2.二叉树 4.2.1.概述 4.2.3.存储结构 4.2.3.遍历 1.逻辑简介 2.代码示例 4.1.树 树&#xff0c;由n(n≥0)个有限节点和边组成一个具有层次关系的数据结构。树需要满足以下条件&#xff1a; 任何结点的子节点不相交。任何子结点只有一个父节点。N个结点&am…

carsim 2020 安装说明及多个版本冲突问题解决

在E盘新建一个文件夹&#xff0c;命名为Carsim 2020在Carsim 2020文件夹中&#xff0c;再新建两个文件夹&#xff0c;分别命名为carsim 2020.0_Data和carsim 2020.0_Prog以管理员的身份运行Setup_CarSim_2020.0_r125554.exe&#xff0c;并将安装目录分别选择第2步中的carsim 20…

【LeetCode每日一题:1742. 盒子中小球的最大数量~~~Map+遍历模式+计数】

题目描述 你在一家生产小球的玩具厂工作&#xff0c;有 n 个小球&#xff0c;编号从 lowLimit 开始&#xff0c;到 highLimit 结束&#xff08;包括 lowLimit 和 highLimit &#xff0c;即 n highLimit - lowLimit 1&#xff09;。另有无限数量的盒子&#xff0c;编号从 1 到…

如何设置网络访问 SQL Express?

网络访问 SQL Express 安全和连接SQL Server 配置Windows 防火墙配置连接服务器一旦在本地计算机上设置了 SQL Express,就可以允许网络成员进行远程连接。有不同的方法可以做到这一点,这些步骤可能不适用于现有的网络环境或身份验证方法。下面是在本地计算机上设置的 SQL Ser…

语音前处理技术在会议场景中的应用及挑战

编者按&#xff1a; 随着在线会议的普及&#xff0c;用户已经不再满足于能听到&#xff0c;而是要有更为极致的听感体验&#xff0c;如何能够在复杂多变的应用场景中依旧保证声音清晰流畅是对会议系统的极大挑战。LiveVideoStackCon2022上海站大会邀请到了全时 音视频研发部经理…

网页大作业代码自取【HTML+CSS制作美味糖果网站】

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【2015】408联考数据结构真题整理

2015 1 题目 答案&#xff1a;A 解析 2 题目 解析 3 题目 解析 4 题目 解析 5 题目 答案&#xff1a;D 解析 6 题目 解析 7 题目 答案&#xff1a;A 解析 8 题目 答案&#xff1a;C 解析 9 题目 解析 10 题目 解析 11 题目 解析 41 题目 答案&#xff1a; 3&a…

Android 深入理解View.post()获取宽高、Window加载View原理

文章目录背景&#xff1a;如何在onCreate()中获取View的宽高&#xff1f;View.post()原理Window加载View流程setContentView()ActivityThread#handleResumeActivity()总结扩展Window、Activity及View三者之间的关系是否可以在子线程中更新UI资料背景&#xff1a;如何在onCreate…