用一个变量控制线程里面的资源问题,线程可见性问题

2023-11-07

线程资源不可见原因:

1、CPU高速缓存造成极短时间内数据的不可见

2、指令重排导致不可见

不可见测试:

 由上图可知,当我们改变eatFlag为true时,并没有输出我们预想的数据(例如:线程中资源正在运行...)

解决办法:

1、线程休眠(sleep)

 如上图,线程休眠的时候,抑制了cpu的高速缓存,使得当前线程内的数据可见,但是不建议这样,因为线程休眠会影响用户的体验感

2、使用线程锁(synchronized)

 对于上锁的线程,一旦一个代码块或者方法被Synchronized所修饰,那么它执行完毕之后,被锁住的对象所做的任何修改都要在释放之前,从线程内存写回到主内存,另一个线程从主内存得到数据并加载到自己线程的内存中。

3、使用volatile(无定性的)修饰变量

 volatile修饰的变量对于外部线程是可见的

总结:

1、线程之间的传参需要保持可见性

2、保持可见性的方法有线程休眠、volatile修饰参数、线程锁等操作。

补充:cpu高速缓存时,不同的线程处于不同的时间片,这些线程相当于不同的程序,所以需要第三者来连接线程,帮助线程传递参数,或者用volatile声明线程里面的资源对所有线程是可见的,因为资源是可见的,所以在多线程下会产生参数线程安全问题

-----------------------------------------------------------分割线-------------------------------------------------------------

注:文章为作者笔记,有问题欢迎评论留言。

@time:2022_11_7

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用一个变量控制线程里面的资源问题,线程可见性问题 的相关文章

  • 如何使用固定数量的工作线程实现简单线程

    我正在寻找最简单 最直接的方法来实现以下内容 主程序实例化worker 执行任务的线程 Only n任务可以同时运行 When n已达到 不再有工人 开始直到计数 正在运行的线程回落到下方n 我觉得Executors newFixedThr
  • 使用 Guice 注入类集合

    我正在尝试用 Google Guice 2 0 注入东西 我有以下结构 FooAction implements Action BarAction implements Action 然后我有一个带有以下构造函数的 ActionLibrar
  • ScheduledThreadPoolExecutor如何在特定时间运行任务?

    特别是 它是否像这样在内部实现了 while true 循环 while System currentTimeMillis lt timeToRunTask Thread sleep 1000 doTask From http grepco
  • 如何在 Java 中访问嵌套的 HashMap?

    我有一个 Java 中的 HashMap 其中的内容 你们可能都知道 可以通过以下方式访问 HashMap get keyname 如果一个 HashMap 位于另一个 HashMap 中 即嵌套的 HashMap 我将如何访问内容 我可以
  • 单元测试组合服务方法

    我正在为一个类编写 junit 单元测试 该类使用以下方法实现公开的接口 public Set
  • Quarkus 不以编程方式选择 bean

    我试图以编程方式选择 bean 但 quarkus 不会注入 bean 并引发异常 不支持吗 public enum ReportType ONE TWO Qualifier Retention RUNTIME Target METHOD
  • 如何在log4j的配置文件中为文件附加器提供环境变量路径

    我有一个log4j xml配置文件 和一个RollingFileAppender我需要提供用于存储日志的文件路径 问题是我的代码将作为可运行的 jar 部署在 Unix 机器上 所以如果我传递这样的参数 value logs message
  • 项目缺少所需的注释处理库

    我的 Eclipse IDE 突然在问题视图中显示 xxxx 项目缺少所需的注释处理库 xxxx M2 REPO 中的一些旧 jar 我用谷歌搜索 没有找到任何答案 为什么我的项目使用旧的 jar 以及错误来自哪里 To remove th
  • 检查 IPv4 地址是否在私有范围内

    在 Python 中 使用 IPy 模块您可以执行以下操作 gt gt gt ip iptype PRIVATE 有没有一个库或简单的方法可以在 Java 中执行相同的操作 似乎不完全是但是InetAddress有一些 isXX 方法 例如
  • Android WebView文件上传

    我正在开发一个 Android 应用程序 基本上它是一个WebView和一个进度条 Facebook 的移动网站 m facebook com 已加载到WebView 当我单击 选择文件 按钮上传图像时 没有任何反应 我已经尝试了所有的解决
  • 需要正则表达式帮助

    我正在尝试替换两次或多次出现的 br like br br br 标签与两个一起 br br 具有以下模式 Pattern brTagPattern Pattern compile lt s br s s gt s 2 Pattern CA
  • LocalDate 减去 period 得到错误的结果

    LocalDate减去一个Period 如 28年1个月27天 得到错误的结果 但减去一个Period 只有天单位 如 10282 天 得到正确的结果 有什么需要注意的吗 public static void main String arg
  • 是否有最新的 Facebook Java SDK? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 好像没找到最近更新的 如果没有 是否有一个好的 Java 库来执行与 Facebook 的 API 交
  • MongoDB java 驱动程序 3.0 在身份验证时无法捕获异常

    我超级卡住o 0 在尝试通过 Java 驱动程序进行身份验证时 存在捕获异常的问题 正如你可能会看到的Throwable类不工作 private MongoClient mongoClient private MongoDatabase m
  • 如何检查日期字符串的有效性?

    在我的项目中 我需要检查日期字符串是否计算为正确的日期对象 我决定允许 yyyy MM dd 和日期格式 年 月 日 和 年 月 日 小时 分钟 我如何检查它们是否有效 我的代码为 1980 01 01 和一些奇怪的日期 如 3837 05
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • 如何将库添加到 LIBGDX 项目的依赖项 gradle

    一切都在问题中 我已经尝试了在 SO 和其他网站中找到的所有答案 但没有运气 这就是我迄今为止尝试过的 adding compile fileTree dir lib include jar 到我的 build gradle adding
  • 在 Freemarker 模板中检查 Spring 安全角色和记录的用户名

    有谁知道 freemarker 标签来检查 freemarker 文件中的 spring 安全角色和用户名 我从网络上的几个资源中发现以下代码将打印登录的用户名 但它没有打印用户名 而是打印 登录为
  • CXF:通过 SOAP 发送对象时如何排除某些属性?

    我使用 Apache CXF 2 4 2 当我将数据库中的某个对象返回给用户时 我想排除一些属性 例如密码 我怎样才能做到这一点无需创建临时的班级 有这方面的注释吗 根据 tomasz nurkiewicz 评论我应该使用 XmlTrans
  • Jackson 反序列化相当于 @JsonUnwrapped 吗?

    假设我有以下课程 public class Parent public int age JsonUnwrapped public Name name 生成 JSON age 18 first Joey last Sixpack 我如何将其反

随机推荐

  • php升级

    1 要使用lumen的单元测试 https lumen laravel com docs 5 2 testing 使用单元测试 cd 项目目录 phpunit tests 里面需要使用phpunit https phpunit de man
  • freeRTOS---空闲任务与阻塞延时(1)

    在上传这篇文章的时候 同时也上传了代码 欢迎下载 RTOS中的延时是在需要延时的时间内任务放弃CPU的使用权 超过延时时间后重新获得CPU的使用权 叫做 阻塞延时 空闲任务是在启动调度器后创建的 是CPU空闲时候运行的 是优先级最低的 空闲
  • Linux实时调度策略(SCHED_RR)和CFS(SCHED_OTHER)之间的区别

    本文试图从直观角度 说明SCHED RR调度策略和SCHED OTHER调度策略之间的区别 在Linux上 SCHED OTHER和SCHED NORMAL的意思相同 它们都是指的CFS调度策略 只不过 在内核中 CFS定义为SCHED N
  • java中的next()方法,nextline()方法,hasnext()方法的用法系列(1)。

    这是王秀秀的第23篇博客 看下方目录 next 方法 nextline 方法 hasnext 方法 最近本菜鸡做题呀 遇到了一些很好玩的事情 那就是scanner类中的一些方法 经过了解后 真挺好玩的 next 方法 话不多说上代码 imp
  • Java中的strip(), split() 分割字符串

    jdk11引进了strip 用来去除字符串的前导和后缀空格 eg str hello world str str strip str hello world split 加上正则化用来分割字符串 1 正则表达式 s 表示匹配任何空白字符 表
  • javaSE从入门到精通的二十万字总结(二)

    目录 前言 5 集合 5 1 集合两大类 5 2 Collection 5 2 1 常用方法 5 2 2 迭代器 5 2 3 contains方法 5 2 4 remove方法 5 3 List 5 3 1 ArrayList 5 3 2
  • nnpack详解

    NNPACK详解 一 NNPACK简介 NNPACK由facebook开发 是一个加速神经网络计算的加速包 NNPACK可以在多核CPU平台上提高卷积层计算性能 NNPACK采用的快速卷积算法是基于Fourier transform 和 W
  • win10+vs2015+cuda10.0+cudnn7.6+anaconda3(python3.7)+tensorflow_gpu1.13.1+pycharm(我的电脑配置:i79700k+1070

    win10 vs2015 cuda10 0 cudnn7 6 anaconda3 python3 7 tensorflow gpu1 13 1 pycharm 我的电脑配置 i79700k 1070Ti 提醒 安装之前先查看自己显卡对应的版
  • FTP暴力破解登陆漏洞复现(Windows Server 2003)

    FTP暴力破解漏洞复现 0x01 漏洞简述 FTP弱口令 一般指使用FTP的用户的密码长度太短 复杂度不够 仅包含数字 或仅包含字母等 容易被黑客攻击 发生恶意文件上传或更严重的入侵行为 知道FTP弱口令 可以通过该漏洞获取主机文件系统信息
  • 规则引擎相关开源项目总结

    表达式引擎 Java Groovy https groovy lang org JEXL https commons apache org proper commons jexl mvel https github com mvel mve
  • 【华为OD机试】停车场车辆统计【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 特定大小的停车场 数组cars 表示 其中1表示有车 0表示没车 车辆大小不一 小车占一个车位 长度1 货车占两个车位 长度2 卡车占三个车位 长度3 统计停车场最少
  • Windows下安装CUDA并配置cuDNN教程

    Windows下安装CUDA并配置cuDNN教程 一 查看电脑的显卡驱动版本 1 键盘点击Windows R或者在搜索栏输入cmd 进入命令提示符 2 在命令提示符下 输入nvidia smi 查看显卡驱动版本 本电脑显卡驱动版本为 456
  • React中引入百度地图API 避坑

    BMap is not defined 原因 React脚手架中全局变量都要用window去访问 解决 BMap改成window BMap访问 或者将BMap从window中解构出来 BMap前加了window 页面还是一片空白 原因 没有
  • QT中文输入法状态下获取键盘输入事件

    QT在中文输入法下 获取键盘的输入消息时 始终获取不到 但是在英文输入状态下是可以获取的 具体看代码 bool mytest eventFilter QObject obj QEvent ev if QEvent KeyPress ev g
  • 诚之和:自嗨锅能颠覆海底捞吗?

    为了避免独自外出就食的尴尬 实现独乐乐的满足感 催生了 一人食经济 2015年 自热火锅横空出世 一经面世就迅速在自热方便类食品中占据一席之地 特别受到年轻人的青睐 九成以上的消费者年龄在40岁以下 自热火锅以其新潮 便利等优势备受消费者欢
  • python实现螺旋矩阵

    import numpy 使用递归解决 def helixMatrix matrix x cur y cur number n if n 0 print matrix return 0 if n 1 matrix x cur y cur n
  • Python 程序设计-系统登录页面设计

    Python 程序设计 系统登录页面设计 目录 Python 程序设计 系统登录页面设计 1 需求分析 2 总体设计 3 详细设计 4 程序运行结果测试与分析 5 完整源代码 1 需求分析 系统要有管理员登录 普通用户登录和退出三个选项可供
  • Modbus协议简易入门教程

    背景 介绍modbus rtu之前 我们可以了解到 Modbus是施耐德电气公司 于1979年发明的 是全球第一个真正用于工业现场的总线协议 四十多年过去了 现在仍然被广泛使用在各个工业控制领域 除了这个协议很稳定的原因之外 1 免费 2
  • 【机会约束、鲁棒优化】机会约束和鲁棒优化研究优化【ccDCOPF】研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 随机规划的三个分支分别为期望值模型 机会约
  • 用一个变量控制线程里面的资源问题,线程可见性问题

    线程资源不可见原因 1 CPU高速缓存造成极短时间内数据的不可见 2 指令重排导致不可见 不可见测试 由上图可知 当我们改变eatFlag为true时 并没有输出我们预想的数据 例如 线程中资源正在运行 解决办法 1 线程休眠 sleep