【多线程】线程的可见性

目录

        • 一、什么是线程的可见性
        • 二、可见性问题示例
          • 2.1 代码
          • 2.2 截图
        • 三、解决可见性问题
          • 3.1 volatile关键字
          • 3.2 synchronized关键字
        • 四、用volatile关键字解决可见性问题示例
          • 4.1 代码
          • 4.2 截图
        • 五、用synchronized关键字解决可见性问题示例
          • 5.1 代码
          • 5.2 截图
        • 六、可见性与原子性

一、什么是线程的可见性

  • 1.当一个线程修改了共享变量的值,其他线程会马上知道这个修改。当其他线程要读取这个变量的时候,最终会去内存中读取,而不是从缓存中读取
  • 2.一个线程对共享变量的修改,另一个线程可以感知到,称为可见性
  • 3.在CPU中存在MESI协议,即缓存的一致性协议:一个线程修改变量,CPU会刷新缓存,并刷新回内存,线程2得知线程1修改变量,cpu2通过总线嗅探机制,会重新去内存中加载变量a

二、可见性问题示例

2.1 代码
package com.learning.visibility;

/**
 * @Description 可见性学习
 */
public class VisibilityLearning {
    static boolean run = true;

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            while(run){
                System.out.println("thread没有停止");
            }
        });
        thread.start();
        Thread.sleep(1000);
        System.out.println("主线程停止thread");
        run = false;
    }
}
2.2 截图

在这里插入图片描述

三、解决可见性问题

3.1 volatile关键字
  • 1.使用volatile [ˈvɑːlətl]关键字修饰变量
  • 2.volatile 易变关键字
  • 3.可以用来修饰成员变量和静态成员变量
  • 4.可以避免线程从自己的工作缓存中查找变量的值,必须从主存中获取变量的值,线程操作volatile变量都是直接操作主存
3.2 synchronized关键字
  • 1.synchronized关键字会清空工作内存,代码块结束后将更改后的共享变量的值刷新到主内存中

四、用volatile关键字解决可见性问题示例

4.1 代码
package com.learning.visibility;

/**
 * @Description 可见性学习
 */
public class VisibilityLearning {
    volatile static boolean run = true;

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            while(run){
                System.out.println("thread没有停止");
            }
        });
        thread.start();
        Thread.sleep(1000);
        System.out.println("主线程停止thread");
        run = false;
    }
}
4.2 截图

在这里插入图片描述

五、用synchronized关键字解决可见性问题示例

5.1 代码
package com.learning.visibility;

/**
 * @Description 可见性学习
 */
public class VisibilityLearning {
    static boolean run = true;

    //锁对象
    final static Object lock = new Object();

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            while(true){
                synchronized (lock){
                    System.out.println("thread没有停止");
                    if(!run){
                        break;
                    }
                }
            }
        });
        thread.start();
        Thread.sleep(1000);
        System.out.println("主线程停止thread");
        synchronized (lock){
            run = false;
        }
    }
}
5.2 截图

在这里插入图片描述

六、可见性与原子性

  • 1.一个线程对volatile变量的修改对另一个线程可见,不能保证原子性,仅用在一个写线程,多个读线程的情况
  • 2.volatile只能保证看到最新值,不能解决指令交错
  • 3.synchronized语句块既可以保证代码块的原子性,也同时保证代码块内变量的可见性,缺点是synchronized是属于重量级的操作,性能相对更低

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

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

相关文章

iTOP-RK3568开发板编译瑞芯微原厂源码

1 输入以下命令设置 java 版本为 1.8 版本,确认 java 版本是 1.8 版本之后,才可以进行下一步编译,如下图所示: source javaenv.sh java -version 2 输入命令配置 Android 分支 source build/envsetup.sh lunch rk3568_r-user…

Ansys Speos 2023 R1新功能 | Texture可视化纹理提升视觉感知

Ansys Speos 2023 R1 新功能介绍 Ansys Speos 持续推动创新,为光学设计人员提供精确、高性能的仿真功能。2023 R1 新版本提供强大的功能,可加快结果生成速度、提高仿真精度并扩展与其他 Ansys 产品的互操作性。 更新Texture映射预览,为textur…

Emacs之高效切换窗口(九十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

AI数字人盛行,如何选择合适的AI数字人制作平台?

2023万象大会已然开启了直播,当AI照进生活、照亮你我,为我们的想象力插上翅膀,世界变得更加便捷、更加智能。可以说近年来,AI帮助人们解决了各种问题,在提高生产效率、改善生活质量等方面做出来很大的贡献,…

代码随想录训练营Day48|● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

目录 学习目标 学习内容 198.打家劫舍 213.打家劫舍II 337.打家劫舍III 学习目标 198.打家劫舍 213.打家劫舍II 337.打家劫舍III 学习内容 198.打家劫舍 198. 打家劫舍 - 力扣(LeetCode)https://leetcode.cn/problems/house-robber/ class Soluti…

为了流量,何同学做了个“假B站”?

何同学是B站知名数码博主,凭借优秀的视频制作能力,内容创新获得广大年轻用户的喜欢。 2021年的时候,UP主老师好我叫何同学就发布了一条制作AirDesk的视频,随后迅速在社交媒体中引发了大量关注。 当时,该视频为B站全站…

【c++】类和对象(中)

【c】类和对象(中) 默认成员函数初始化和清理构造函数重载分类使用场景 析构函数使用场景 拷贝赋值拷贝构造函数使用场景浅拷贝与深拷贝 赋值重载赋值重载和拷贝构造函数的区别使用场景 取地址重载 本篇博客主要讲:六个默认成员函数 默认成员…

SpringBoot配置文件 | 多环境配置 | 读取配置的4种方式

文章目录 一、写配置文件的位置读取的优先级:1.文件位置:2.文件名和文件后缀:3.配置文件中的profile-specific文件:4.命令行参数 二、多环境配置1. properties:2. yaml 三、yaml配置文件yaml、properties、xml对比&…

Gateway服务网关入门

Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。…

OpenAI ChatGPT Unity接入

OpenAI ChatGPT Unity接入 OpenAI ChatGPT Unity接入OpenAi-API-Unity 方法OpenAi-API-Unity 下载本地配置Unity 模块URL接入gz 接入json 接入Open AIOpenAi-Api-Unity 插件文档 OpenAi 本地化接入 Unity 方法Unity 关键字识别语音合成 & 文字转语音音频记录 & 实时音频…

C语言_数据类型[详细分析]

接上一篇:C语言_关键字_标识符简介 本次来分享C语言的数据类型,是博主的一些学习笔记的和心得的总结,话不多说,开始上菜: 此博主在CSDN发布的文章目录:我的CSDN目录,作为博主在CSDN上发布的文章…

四个PCB工程师最头痛的Allegro问题及解答,你一定要看

Allegro是一款功能强大的PCB设计软件,广泛应用在电子设计行业,在使用Allegro过程中,工程师会遇见到多种复杂的技术问题,本文将针对工程师最头痛的Allegro问题进行回答,希望对小伙伴们有所帮助。 1、如何创建新的Allegr…

线上问题处理案例:出乎意料的数据库连接池 | 京东云技术团队

导读 本文是线上问题处理案例系列之一,旨在通过真实案例向读者介绍发现问题、定位问题、解决问题的方法。本文讲述了从垃圾回收耗时过长的表象,逐步定位到数据库连接池保活问题的全过程,并对其中用到的一些知识点进行了总结。 一、问题描述…

高丰度铈磁体

随着烧结钕铁硼应用领域的不断拓展和产量的快速增长,相应的稀土资源也被大量开采。稀土矿中各种稀土元素是共生的,但在钕铁硼的制备过程中,利用的主要是在轻稀土中质量分数为25%的镨Pr和钕Nd元素,这样对轻稀土中占比为质量分数49%…

AIGC周报|让AI来画《海贼王》;苹果限制员工使用ChatGPT;李彦宏:不担心大模型会让工作消失

AIGC(AI Generated Content)即人工智能生成内容。近期爆火的 AI 聊天机器人 ChatGPT,以及 DallE 2、Stable Diffusion 等文生图模型,都属于 AIGC 的典型案例,它们通过借鉴现有的、人类创造的内容来快速完成内容创作。 …

MySQL备份

MySQL的备份方式有哪几种?分别如何实现? 目录 一、数据的备份类型 1、数据的备份类型根据其自身的特性主要分为以下几组: 二、MySQL备份数据的方式 三、常见的备份工具 1、一般情况下, 我们需要备份的数据分为以下几种 2、备份工具 3…

SpringBoot—常用注解

目录 一、注解(annotations)列表 二、注解(annotations)详解 三、JPA注解 四、springMVC相关注解 五、全局异常处理 一、注解(annotations)列表 SpringBootApplication: 包含了ComponentScan、Configuration和EnableAutoConfiguration注解。其中ComponentScan…

【大学物理实验】基本测量

50分度的游标卡尺,最小分度为: A. 0.1mm B. 0.2mm C. 0.5mm D. 0.02mm 正确答案: D 保存游标卡尺和螺旋测微器是,下面说法正确的是: A. 游标卡尺测量位置应闭合,螺旋测微器小砧和螺杆间隙也应闭合 B. 游标…

Matlab论文插图绘制模板第94期—带置信区间的折线散点图

在之前的文章中,分享了很多Matlab带置信区间的折线图的绘制模板: 进一步,再来分享一下带置信区间的折线散点图的绘制模板。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋友…

SSD202 Linux开发日志记录

一、挂载U盘 SDK默认自动加载USB存储模块,但没有自动挂载,插上U盘后识别sda mount /dev/sda /mnt/即可在/mnt查看U盘文件 二、make & make menuconfig提示失败 打开新终端后输入 declare -x ARCH"arm" declare -x CROSS_COMPILE"…
最新文章