可见性::

目录

定义:

解决方法:

①使用synchronized实现缓存和内存的同步

修改一:

加入语句:

代码:

修改2:

在代码块中加入:

代码:

执行结果:

原因:

②使用volatile实现变量可见性 


定义:

当多个线程访问同一个变量的时候,一个线程修改了这个变量的值,其他线程肯呢个看不到立即修改的值,他们之间存在着不可见的问题

导致这个的问题在于,多核cpu的多个核之间他们的高速缓存并不会共享,而各自运算的无数据肯呢个存在各自的高速缓存中

解决方法:

①使用synchronized实现缓存和内存的同步

public class Test1 {
    public  static Boolean always = true;
    public static void main(String[] args) {
       //子线程
        new Thread(()->{
           while (always){//主线程中修改了always的值,在子线程中没看到
             
           }

       }).start();
        try {
            Thread.sleep(2000);//主线程
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        always=false;

    }
}

执行结果:程序一直运行,不结束,主线程中修改了always的值,在子线程中没看到

修改一:

加入语句:
 synchronized (always){}
代码:
public class Test1 {
    public  static Boolean always = true;
    public static void main(String[] args) {
       //子线程
        new Thread(()->{
           while (always){
             
              synchronized (always){}
           }

       }).start();
        try {
            Thread.sleep(2000);//主线程
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        always=false;

    }
}

执行结果:运行两秒钟结束

原因是,同步了always语句修改的结果

修改2:

在代码块中加入:
System.out.println("hello");
代码:
public class Test1 {
    public  static Boolean always = true;
    public static void main(String[] args) {
       //子线程
        new Thread(()->{
           while (always){
             
               System.out.println("hello");
           }

       }).start();
        try {
            Thread.sleep(2000);//主线程
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        always=false;

    }
}
执行结果:

打印两秒钟hello,结束 

原因:

println函数中包含了sychronized,解决了可见性问题 

②使用volatile实现变量可见性 

定义变量的时候使用volatile

 public volatile static Boolean always = true;

代码:

public class Test1 {
    public volatile static Boolean always = true;
    public static void main(String[] args) {
       //子线程
        new Thread(()->{
           while (always){

                      }

       }).start();
        try {
            Thread.sleep(2000);//主线程
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        always=false;

    }
}

 执行结果:执行两秒

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

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

相关文章

RPA软件-影刀使用

流程自动化 影刀将操作进行抽象,分为一下几个对象: 网页自动化 (1) 网页自动化应用场景:网页操作、数据抓取 (2) 网页操作:基础操作-指令操作,智能操作-关联元素&#…

PTrade常见问题系列15

某容器占用内存很高需要关闭处理? 1、若只是关闭部分进程,则需要进入容器后top -b 排序出资源占用消耗最高的几个进程,通过kill -9的方式进行清理; 2、若要关闭对应容器,则在管理端勾选后进行关闭容器操作或者在后台执…

【学习笔记】解决Serial Communication Library编译问题

【学习笔记】解决编译 Serial Communication Library 时的 Catkin 依赖问题 Serial Communication Library 是一个用 C 编写的用于连接类似 rs-232 串口的跨平台库。它提供了一个现代的 C 接口,它的工作流程设计在外观和感觉上与 PySerial 相似,但串口速…

本地化部署一个简单的AI大模型,Llama3.1

7 月 23 日消息,Meta 今晚正式发布llama3.1,提供 8B、70B 及 405B 参数版本。 Meta 称 4050 亿参数的 Llama 3.1-405B 在常识、可引导性、数学、工具使用和多语言翻译等一系列任务中,可与 GPT-4、GPT-4o、Claude 3.5 Sonnet 等领先的闭源模型…

KETTLE运行出现乱码和无法执行问题及解决方案

一、乱码问题 (1)出现乱码,在数据库连接里面的选项里面加入:characterEncodingutf8和tinyInt1isBitfalse (2)取消简易转换,点开表输入,取消”允许简易转换”选项&a…

学习笔记:MySQL数据库操作5

1. 触发器(Triggers) 触发器是数据库的一种高级功能,它允许在执行特定数据库操作(如INSERT、UPDATE、DELETE)之前或之后自动执行一段代码。 1.1 创建商品和订单表 商品表(goods) gid: 商品编号…

【LeetCode:3098. 求出所有子序列的能量和 + 记忆化缓存】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

c++ 内存管理(newdeletedelete[])

因为在c里面新增了类,所以我们在有时候会用malloc来创建类,但是这种创建只是单纯的开辟空间,没有什么默认构造的。同时free也是free的表面,如果类里面带有指针指向堆区的成员变量就会free不干净。 所以我们c增加了new delete和de…

22、Python之面向对象:万类霜天竞自由

引言 虽然,截止目前从来没有系统性地讲述面向对象的内容,但是阅读过前面文章的童鞋,关于Python中的面向对象应该有如下观念了: 1、Python中一切皆对象,对象有三个核心内容:id、类型、值。 2、Python中的…

2024 微信小程序 学习笔记 第二天

1. WXML 模板语法 数据绑定 事件绑定 条件渲染 列表渲染 2. WXSS 模板样式 rpx 样式导入 全局和局部样式 3. 全局配置 window tabBar 配置tabBar案例 4. 网络数据请求 Get请求 Post 请求 加载时请求 5. 案例 -本地生活(首页) 导航栏 轮播图 九宫格效果…

设计模式--创建型

实现 #include <iostream> #include <memory>// 抽象产品类 class Product {public:virtual ~Product() {}virtual void Operation() const 0; };// 具体产品 类A class ConcreteProductA : public Product {public:virtual void Operation() const override {st…

Ubuntu 22.04.4 LTS (linux) Tomcat 9 内存和线程优化

1 Apache Tomcat 9.0.91 线程 #在70行左右&#xff0c;增加如下 sudo vim /data/tomcat/conf/server.xmlmaxThreads"800" #客户请求最大线程数minSpareThreads"200" #最小线程数maxSpareThreads"500" #最大线程数acceptCount"800"…

unity2D游戏开发05摄像跟踪

图形设置 打开项目设置 选择Quality,关闭抗锯齿功能和各向异性纹理。 抗锯齿算法在对象的边缘上运行,并为其提供平滑的外观以补偿锯齿形状的输出效果,但我们不需要对像素艺术风格的2D游戏进行抗锯齿处理。 各向异性过滤是一种在使用特定类型的摄像机视角时提高图像质量的方…

单例模式_Golang

目录 一、单例模式 1.1 基本概念 1.2 使用场景 二、Golang实现 2.1 懒汉模式&#xff08;Lazy Loading&#xff09; 一、单例模式 1.1 基本概念 一个类只能生成一个实例&#xff0c;且该类能自行创建这个实例的一种模式,这个定义个人感觉可以拆的通俗一些,在项目的生命周…

【轨物方案】开关柜在线监测物联网解决方案

随着物联网技术的发展&#xff0c;电力设备状态监测技术也得到了迅速发展。传统的电力成套开关柜设备状态监测方法主要采用人工巡检和定期维护的方式&#xff0c;这种方法不仅效率低下&#xff0c;而且难以保证设备的实时性和安全性。因此&#xff0c;基于物联网技术的成套开关…

Android中systrace配置及注意问题

Android中systrace配置及注意问题 systrace配置的官方文档地址如下&#xff1a;优化启动时间 Systrace systrace 允许在启动期间收集内核和 Android 跟踪记录。systrace 的可视化可以帮助分析启动过程中的具体问题。&#xff08;不过&#xff0c;如果要查看整个启动过程中的平…

抖音私信卡片跳转微信教程

以下是使用 W 外链制作抖音私信卡片跳转微信的一般教程&#xff1a; ​ **步骤一&#xff1a;准备工作** 1. 注册并登录 W 外链平台账号。 2. 并获取相关的链接或二维码。 **步骤二&#xff1a;创建跳转链接** 1. 在 W 外链平台中&#xff0c;选择创建新的跳转链接。 2.…

llama模型,nano

目录 llama模型 Llama模型性能评测 nano模型是什么 Gemini Nano模型 参数量 MMLU、GPQA、HumanEval 1. MMLU(Massive Multi-task Language Understanding) 2. GPQA(Grade School Physics Question Answering) 3. HumanEval llama模型 Large Language Model AI Ll…

基于MediaPipe的手部特征点识别

基于MediaPipe的手部特征点识别 MediaPipe简介 MediaPipe Solutions 提供了一套库和工具&#xff0c;可以在安卓或者windows应用中快速应用人工智能 (AI) 和机器学习 (ML) 技术。 MediaPipe 手部地标任务可检测图片中手部的特征点。识别效果如下 环境配置 python -m pip ins…

GRE VPN和MGRE VPN综合练习

GRE VPN和MGRE VPN综合练习 实验拓扑 实验要求 1、R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址; 2、R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方; R2与R5之间使用ppp的CHAP认证&#xff0c;R5为主认证方; R3与R5之间使用HDLC封装;…