java内存屏障

参考:https://blog.csdn.net/weixin_73077810/article/details/132804522

内存屏障主要用于解决线程的可见性有序性问题

代码案例:

ReentrantLock保证可见性的原理
        在 lock.lock() 和 lock.unlock() 时,都会操作 AbstractQueuedSynchronizer类 中的一个变量 state,这个变量是 volatile 修饰的,volatile变量的语句对应的汇编码指令中会多加一行lock addl $0x0, (%esp),这一行的作用是:

(1)将工作内存修改了的缓存(不仅仅是该变量的缓存)都强制刷新回主内存

(2)把其他CPU对应缓存行标记为invalid状态,那么在读取这一部分缓存时,必须回主内存读取。这样也就保证了线程间的可见性

        具体来说,当一个线程获取ReentrantLock锁时(state值改变),它会将主内存中的数据刷新到自己的工作内存中state值改变之后的所有对共享变量的读操作)。而当一个线程释放ReentrantLock锁时(state值改变),它会将自己工作内存中的数据刷新到主内存中(state值改变之前的所有对共享变量的写操作),这样其他线程就能够读取到最新的值。

备注:

volatile变量改变之后所有的共享变量读操作都会从主内存中重新获取最新值到工作内存,volatile变量改变之前的所有共享变量的改变都会刷新到主内存

一个自己写的测试类

import org.junit.jupiter.api.Test;

import java.util.concurrent.TimeUnit;
class TestCache {

    private volatile  Boolean r=false;
    private String string="1";


    Thread readThread=null;
    Thread writeThread=null;

    /**
     *
     */
    @Test
    void contextLoads() throws InterruptedException {
        readThread=new Thread(()->{
            while (true){
//下面的这2个if顺序说明了:volatile后的共享变量重新获取了,之前的不再重新获取
//                if( r && string.contentEquals("2")  ){//能看到string的变化
                if(  string.contentEquals("2") && r  ){//不能看到string的变化
                    System.out.println("end task");
                    break;
                }
            }

        });
        writeThread=new Thread(()->{
            string="2";
            r=true;
        });

        readThread.start();
        TimeUnit.SECONDS.sleep(2);

        writeThread.start();
        readThread.join();
    }



}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux命令入门及ls命令

由于大家第一次接触到Linux命令,故此篇会详细讲述什么是命令,什么又是命令行?Linux命令的基础结构,什么是工作目录,什么又是HOME目录?并且带大家熟悉ls命令的基础使用。 1.命令和命令行 命令行&#xff1a…

mybatisPlus CodeGenerator 代码生成

在 test 目录下新建 CodeGenerator 类,用于 mybatis-plus 自动生成 java 代码 package com.edward;import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplu…

Git 实战指南:常用指令精要手册(持续更新)

👑专栏内容:Git⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、Git 安装过程1、Windows 下安装2、Cent os 下安装3、Ubuntu 下安装 二、配置本地仓库1、 初始化 Git 仓库2、配置 name 和 e…

数字系统课程设计与VHDL报告

获“优”,含实验结果视频、代码、报告,99.99%原创,配置环境太复杂不包跑通,要的私信。

听GPT 讲Rust源代码--compiler(30)

File: rust/compiler/rustc_const_eval/src/transform/promote_consts.rs 在Rust的编译器源代码中,rust/compiler/rustc_const_eval/src/transform/promote_consts.rs文件的作用是执行常量传播和优化的转换过程。 该文件中的PromoteTemps结构体是一个转换器&#xf…

【教学类-45-02】X-Y之间的三连减题(a-b-c=)

作品展示: 背景需求: 【教学类-45-01】X-Y之间的三连加题(abc)-CSDN博客文章浏览阅读5次。【教学类-45-01】X-Y之间的三连加题(abc)https://blog.csdn.net/reasonsummer/article/details/135436915 有了三连加怎么能没有三连减,修改参数&am…

SpringIOC之support模块FileSystemXmlApplicationContext

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

应用OpenCV绘制箭头

绘制箭头函数 方法:函数cv2.arrowedLine( ) 语法格式:cv2.arrowedLine(img, pt1, pt2, color[, thickness[, line_type[, shift[, tipLength]]]]) 参数说明: img:要画的直线所在的图像,也称为画布。。 pt1&#x…

BERT(从理论到实践): Bidirectional Encoder Representations from Transformers【1】

预训练模型:A pre-trained model is a saved network that was previously trained on a large dataset, typically on a large-scale image-classification task. You either use the pretrained model as is or use transfer learning to customize this model to a given t…

查找的数据结构实验报告(哈希表)

目录 一、实验目的: 二、实验内容(实验题目与说明) 三、算法设计(核心代码或全部代码) 四、运行与测试(测试数据和实验结果分析) 五、总结与心得 一、实验目的: (1)理解查找表…

windows 查看所有端口占用情况

winR,调出cmd窗口: 输入命令 netstat -ano 内容太多,显示不全,怎么办? 输入下面命令 netstat -ano > d:\1.log 在d盘根目录下就产生了 输出文件 打开可以看到如下内容 活动连接协议 本地地址 外部地址 状…

小家电type-c接口PD诱骗

小家电Type-C接口PD诱骗:未来充电的便捷与安全 随着科技的不断发展,Type-C接口已经成为了许多小家电产品的标配。而PD(Power Delivery)诱骗技术,作为一种新兴的充电技术,更是为小家电产品的充电带来了前所…

密码学入门 古老的围栏密码技术

1、简述 由于隐私和安全的重要性不断增加,已经开发了多种加密方法和技术来保护我们的敏感数据。随着时间的推移而演变,从经典密码学发展到现代密码学。 在本文中,我们将了解一种被称为围栏密码技术的技术,涵盖其加密和解密过程及其…

【IC设计】移位寄存器

目录 理论讲解背景介绍什么是移位寄存器按工作模式分类verilog语法注意事项 设计实例循环移位寄存器算术双向移位寄存器5位线性反馈移位寄存器伪随机码发生器3位线性反馈移位寄存器32位线性反馈移位寄存器串行移位寄存器(打4拍)双向移位寄存器&#xff1…

Java研学-web操作crud

一 思路 1 组件 页面显示:JSP   接受用户请求:Servlet   和数据库交互:MyBatis 2 基础准备 ① 创建 web 项目,导入需要依赖的 jar 包,放入 web/WEB-INF/lib目录中 ② 创建数据库表 CREATE TABLE employee( id bigint(11)…

八大算法排序@归并排序(C语言版本)

目录 归并排序概念算法思想第一步第二步第三步 算法步骤代码实现代码1代码优化 时间复杂度空间复杂度特性总结 归并排序 概念 归并排序(Merge Sort)是一种基于分治策略的经典排序算法。它的基本思想是将待排序的数组划分成两个子数组,分别对…

响应式布局 Bootstrap

响应式开发 原理:就是根据媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的。 响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。 原理:就是在不同屏幕下,通过媒体查询来改变这…

基于Python+Django,开发一款房屋租赁系统

学习文档 学习过程中,遇到问题可以咨询作者 功能介绍 平台采用B/S结构,后端采用主流的PythonDjango进行开发,前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能包括:首页、房屋详情页、用户中心模块。…

[java]JAVA中文版API手册 -jdk_api_1.8

有mac和win版本 链接:https://pan.baidu.com/s/14WGXJYBICeSxgg6OxBVGRQ 提取码:c03p