Java——》可见性

news/2024/5/17 17:22:43 标签: java, 可见性, volatile, synchronized, Lock, final

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Redis】
    总结——》【Kafka】
    总结——》【Spring】
    总结——》【SpringBoot】
    总结——》【MyBatis、MyBatis-Plus】
    总结——》【Linux】
    总结——》【MongoDB】
    总结——》【Elasticsearch】

Java——》可见性

一、概念

可见性是指线程间的,对变量的变化是否可见。通常被解释为将线程本地状态反映到主内存上,volatile就是负责保证可见性的。

1、可见性问题

可见性问题是指一个线程修改了一个共享变量的值,但是另一个线程无法立即看到这个修改后的值。

2、为什么会有可见性问题

CPU处理速度非常快,相对CPU来说,去主内存获取数据这个事情太慢了,CPU就提供了L1,L2,L3的三级缓存,每次去主内存拿完数据后,就会存储到CPU的三级缓存,每次去三级缓存拿数据,效率肯定会提升。

因为每个线程都有自己的工作内存(CPU三级缓存),线程之间无法直接访问对方的工作内存,只改自己的工作内存,没有及时的同步到主内存,导致一个线程对共享变量的修改对其他线程不可见,从而出现数据不一致。

3、数据同步过程

CPU在处理时,需要将主内存数据刷新到寄存器中再执行指令,执行完指令后,再将寄存器数据刷新到主内存中。遵循MESI协议,不是每次操作结束都将CPU缓存数据同步到主内存。
image.png

二、在Java中保证可见性的方式

volatile_29">1、volatile

参考链接:Java——》volatile

保证每次CPU操作数据时,修改后的值立即被写回主内存,其他线程在读取该变量时可以直接从主内存中获取最新值

synchronized_33">2、synchronized

参考链接:Java——》synchronized保证可见性

确保同一时刻只有一个线程访问共享变量,从而避免了多线程并发访问时对共享变量的竞争和冲突

Lock_37">3、Lock

参考链接:Java——》ReentrantLock

image.png

final_41">4、final

final修饰的属性,在运行期间是不允许修改的,这样一来,就间接的保证了可见性,所有多线程读取final属性,值肯定是一样。

Q:finalvolatile不允许同时修饰一个属性?
A:final修饰的内容已经不允许再次被写了,而volatile是保证每次读写数据去主内存读取,并且volatile会影响一定的性能,就不需要同时修饰。
image.png


http://www.niftyadmin.cn/n/5156178.html

相关文章

多功能声学综合馆:空间的“膜法师”

建筑是文明的承载者,是历史的见证者,也是城市的象征。但在现代都市中,我们不仅需要“固定”的建筑,更需要灵活与多功能性的空间。而这,正是多功能声学综合馆为我们带来的“膜法”。 不仅仅是建筑,更是艺术的…

mvn -u

一、 mvn -U 说明 -U,--update-snapshots Forces a check for missing releases and updated snapshots on remote repositories 意思是:强制刷新本地仓库不存在release版和所有的snapshots版本。 对于release版本,本地已经存在,则不会重复…

TypeScript - 泛型 - 泛型接口和泛型类

介绍 泛型接口 : 就是在定义接口的时候声明泛型,接口内可以使用该泛型 泛型类 : 就是在定义类的时候声明泛型,类中可以时候该泛型本案例的代码很简单,还请各位coder 对照代码阅读。写段代码展示一下 泛型接口 // 声…

20231106_抽象类abstract

抽象类abstract 关键字 abstract运用抽象类抽象方法:修饰抽象类中的某个方法,强制子类重写该方法 归纳 关键字 abstract 对于子类必须要实现特定方法,当时父类无法明确时,可定义为抽象类及抽象方法 不合理: 动物吃东西是基础,在这里写吃的方法过于简单,信息没有实际意义; 怎…

基于SSM的校园二手交易网站设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

(05)Mycat实现水平分表

1、schema.xml <?xml version"1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat"http://io.mycat/"><schema name"TESTDB" checkSQLschema"false" sqlMaxLimit"…

使用Java分割PDF文件

在Java中&#xff0c;我们可以使用iText库来处理PDF文件。iText是一个流行的Java库&#xff0c;用于创建和处理PDF文件。在本篇博客中&#xff0c;我们将介绍如何使用Java分割一个PDF文件为多个小的PDF文件。 1. 引入iText依赖 首先&#xff0c;我们需要在项目中引入iText库的…

(附源码)基于springboot鲜花商城小程序-计算机毕设 84731

基于springboot微信小程序的鲜花商城 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;微信小程序的鲜花商…