JAVA中Volatile/Synchronized

news2024/11/25 10:40:31

线程安全问题的发生:

java的线程内存模型中定义了每个线程都有一份自己的共享变量副本(本地内存),里面存放自己私有的数据,其他线程不能直接访问,而一些共享变量则存在主内存中,供所有线程访问。
上图中,如果线程A和线程B要进行通信,就要经过主内存,比如线程B要获取线程A修改后的共享变量的值,要经过下面两步:
(1)、线程A修改自己的共享变量副本,并刷新到了主内存中。
(2)、线程B读取主内存中被A更新过的共享变量的值,同步到自己的共享变量副本中。
总结:在java内存模型中,共享变量存放在主内存中,每个线程都有自己的本地内存,当多个线程同时访问一个数据的时候,可能本地内存没有及时刷新到主内存,所以就会发生线程安全问题。

JAVA多线程的三个特性: 原子性、可见性、有序性

Volatile关键字作用:

(1)volatile关键字的作用就是保证了可见性和有序性(不保证原子性),如果一个共享变量被volatile关键字修饰,那么如果一个线程修改了这个共享变量后,其他线程是立马可知的。线程A修改了共享变量副本,此时如果该变量被volatile修饰,那么本次修改结果会立即刷新到主存中.

(2)volatile禁止指令重排序优化,保证了有序性。

(3)volatile 的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令

synchronized关键字的作用

(1)volatile只能作用于变量,使用范围较小。synchronized可以用在变量、方法、类、同步代码块等,使用范围比较广。

(2)volatile只能保证可见性和有序性,不能保证原子性。而可见性、有序性、原子性synchronized都可以包证。

(3)volatile不会造成线程阻塞。synchronized可能会造成线程阻塞。

(4)在性能方面synchronized关键字是防止多个线程同时执行一段代码,就会影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized。

指令重排:

        指令重排是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。但是重排序可以保证最终执行的结果是与程序顺序执行的结果一致,并且只会对不存在数据依赖性的指令进行重排序,这个重排序在单线程下对最终执行结果是没有影响的,但是在多线程下就会存在问题。

如何判断锁现象中锁的是谁?知道锁到底锁的是谁?

(1)synchronized修饰的方法---锁的是调用这个方法的对象,普通方法是不受锁的影响的,举例:

(2) static是静态修饰变量,当类一加载时就有了,而phone是对象,只有当对象创建时才会有

        static对应的是类模板,全局唯一,这个模板创建的对象可以有多个,但是这个模板只有一个

        所以,方法加了static之后,再被synchronized修饰,锁的就是模板,而不是对象了,在这个模板上的多个对象也会在锁内。举例:

--> 当一个对象的不同synchronized方法,拿到的是同一把锁

--> 当加了static synchronized方法,是多个对象之间的一把锁

两把锁不一样,相互之间没有影响

1、一个对象,一个synchronized方法,一个对象,普通方法无关锁

2、多个对象,一个synchronized方法,多把锁

3、多个对象,多个synchronized方法,多把锁

4、一个对象,多个synchronized方法是一个锁,普通方法无关

5、多个对象,多个static synchronized方法,锁了模板,成了一个锁

6、单个对象,一个synchronized方法,一个static synchronized方法,不同的两把锁,一个模板锁、一个对象锁,相互不影响

7、两个对象,一个synchronized方法,一个static synchronized方法,不同的三把锁,一个模板锁,两个对象锁

 

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

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

相关文章

DBCO-Sulfo-NHS二苯基环辛炔-磺基活性酯1400191-52-7水溶性试剂

DBCO-Sulfo-NHS Ester二苯基环辛炔-磺基活性酯1400191-52-7 名称:二苯基环辛炔-磺基-琥珀酰亚胺酯 英文名称:DBCO-Sulfo-NHS Ester 结构式: CAS:1400191-52-7 外观:固体/粉末 分子式:C25H21N2NaO8S 分子量&#x…

【图像压缩】JEPG图像压缩【含Matlab源码 1167期】

⛄一、DCT图像无损压缩简介 1 图像压缩 图像压缩按照压缩过程中是否有信息的损失以及解压后与原始图像是否有误差可以分为无损压缩和有损压缩两大类。无损压缩是指不损失图像质量的压缩,它是对文件的存储方式进行优化,采用某种算法表示重复的数据信息&a…

免费l2接口有什么特点?

作为增值行情,免费l2接口行情特点如下: 1、更丰富的信息 更多的盘口订单数据、逐笔成交数据、成交与订单关联数据及增值数据,揭示交易细节,全方位反映市场状态。 2、更丰富的委托盘口 提供买卖方10个价位的价格、股数和委托笔…

DCN神州数码——设备基本指令 (超详细)

神州数码——设备基本操作 Telnet telnet-server enable username DCN privilege 15 password DCN authentication securityip ip authorization line vty command <1-15> {local | radius | tacacs} SSH ssh-server enable username DCN privilege 15 password DCN …

2022沙丘大会 · 信创专场 GBASE告诉您金融行业数据库如何选型

12月10日&#xff0c;2022沙丘大会信创专场如期召开&#xff0c;本期专场由沙丘社区与中国信通院数据库应用创新实验室联合主办&#xff0c;GBASE南大通用技术总监冯文忠受邀出席并分享《国产数据库金融行业应用情况》主题演讲。 数据库作为金融信息系统的关键环节&#xff0…

产品更新-镭速Raysync v6.5.8.0版本发布

镭速版本在近期发布了v6.5.8.0版本&#xff0c;下面我们一起来看下做了哪些更新。 功能一、支持敏感词检测 互联网时代的发展&#xff0c;用户不断产生海量信息&#xff0c;从而也导致了垃圾信息增加&#xff0c;如政治敏感词、违禁词、垃圾广告、色情、血腥暴力等不良信息&am…

AI的进化方向,正在被改写

文|智能相对论 作者|沈浪 人工智能产业的创新焦点已经发生了转移&#xff0c;过去大多谈的是应用创新&#xff0c;如今一场面向底层的技术普惠创新正在持续推进&#xff0c;成为新华三等头部AI厂商相互角力的关键。 日前&#xff0c;新华三刚刚召开一场主题为“进化智能算赋…

【DELM回归预测】基于matlab海鸥算法改进深度学习极限学习机SOA-DELM数据回归预测【含Matlab源码 1977期】

⛄一、PSO-DELM简介 1 DELM的原理 在2004年&#xff0c;极限学习机&#xff08;extreme learning machine,ELM&#xff09;理论被南洋理工大学的黄广斌教授提出&#xff0c;ELM是一种单隐含层前馈神经网络&#xff08;single-hidden layer feedforward neural network,SLFN&am…

精华推荐 |【开发百宝箱之猿如意使用指南】「工欲成其事,必先利其器」一文教你如何通过“猿如意” 优化工作、生活和学习!

开发百宝箱之猿如意使用指南【欢迎您】使用“猿如意”百宝箱大家科普一下什么是猿如意&#xff1f;赶快趁热下载个【猿如意】吧【猿如意】使用体验打分和评估【猿如意】整体功能评分【猿如意】UI效果评分【猿如意】易用性效果【猿如意】各组件评分每个程序猿值得拥有的学习开发…

python清空字典的两种方法

python清空字典的两种方法比较 这里说的clear是指清空python中的字典内容&#xff0c;与删除该字典不一样。 例如&#xff1a; d{‘name’:1,‘age’:2} 想要清空该字典有两个方法 方法1&#xff1a; d.clear() 打印出d 的值为&#xff5b;&#xff5d; 方法2&#xff…

java 10--- static

static 修饰成员变量: 实例成员变量必须要new一个对象&#xff0c;静态成员变量可以不new对象 静态成员变量例子&#xff1a; static修饰成员变量内存图&#xff1a; static修饰成员方法&#xff1a; ​​​​​​​ 修饰成员方法内存图&#xff1a; 注意事项&#xff1a…

裁员后,那些被“优化”的程序员都去哪儿了?

程序员在35岁真的会被裁吗&#xff1f; 被裁之后去哪儿工作 &#xff0c;怎么办啊&#xff1f; 在很多社交平台&#xff0c;经常能看到不少小伙伴问出这样的问题&#xff0c;既迷茫&#xff0c;又慌张。有人说自己25岁就已经被裁了&#xff0c;也有人说做程序员&#xff0c;3…

mysql详情之MVCC由浅入深

概念 MVCC&#xff08;Multiversion Concurrency Control&#xff09;&#xff1a;多版本并发控制。是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问。 MVCC的实现思路 修改数据时&#xff0c;都对应一个修改者所属的事务【前提条…

统计学习方法 | 朴素贝叶斯

朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法 对于给定的训练数据集&#xff0c;首先基于特征条件独立假设学习输入 / 输出的联合概率分布&#xff1b;然后基于此模型&#xff0c;对给定的输入x&#xff0c;利用贝叶斯定理求出后验概率最大的输出y 朴素贝叶斯法…

数据结构---无序数组排序后的最大相邻差

无序数组排序后的最大相邻差先排序&#xff0c;在一个一个求差&#xff0c;找出最大的差解法2(计数排序变体)第一步第二步第三步第四步例子JAVA实现解法3(桶排序变体)第一步第二步第三步例子JAVA实现有一个无序整型数组&#xff0c;如何求出该数组排序后的任意两个相邻元素的最…

洛谷千题详解 | P1022 [NOIP2000 普及组] 计算器的改良【C++、Python、Java语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目背景 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; Python源码&#xff1a; Java源码&#xff1a; ---------------------------------------------------------------…

前端基础_绘制带边框矩形

绘制带边框矩形 今天给小伙伴分享&#xff0c;如何在canvas画布中绘制一个矩形。在本例中调用了脚本文件中的draw函数进行图形描绘。该函数放置在body属性中&#xff0c;使用“οnlοad"draw(canvas);"”语句&#xff0c;调用脚本文件中的draw函数进行图像描画。在本…

大数据组件之Flink

文章目录大数据组件之Flink一.Flink简介Flink是什么&#xff1f;Flink的特点Flink框架处理流程Flink发展时间线Flink在企业中的应用Flink的应用场景为什么选择Flink&#xff1f;传统数据处理架构有状态的流式处理&#xff08;第一代流式处理架构&#xff09;流处理的演变&#…

实锤了,尤大妥妥的二次元迷弟 —— 聊聊 Vue 的进化历程

文章目录实锤了&#xff0c;尤大妥妥的二次元迷弟 —— 聊聊 Vue 的进化历程1. 前言2. 库阶段2.1 阶段发展2.2 设计重点和特征3. 框架阶段3.1 阶段发展3.2 设计重点4. 通用框架阶段4.1 阶段发展4.2 设计重点4.3 典型案例5. 编译/运行时混合阶段5.1 阶段发展5.2 设计重点5.3 框架…

五十二——六十二

五十二、JavaScript——函数简介 一、函数 函数&#xff08;Function)- 函数也是一个对象 - 它具有其他对象所有的功能 - 函数中可以储存代码&#xff0c;且可以在需要时调用这些代码 语法&#xff1a; function 函数名&#xff08;&#xff09;{ 语句。。。 } 调用函数- 调用…