线程安全性问题的原因

1.抢占式执行随机调度


  这里的意思就是,当两个线程同时启动的时候,两个线程会同时进行,并且是抢占式执行的。

而且是随机调度资源的。

如代码:

public class Deome4 {public static void main(String[] args)  {Thread t1 = new Thread(()-> {for(int i = 0; i < 100; i++){try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("t1线程");}});Thread t2 = new Thread(()-> {for(int i = 0; i < 100; i++){try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("t2线程");}});t1.start();t2.start();}
}

如打印结果:

以上我们可以看到,线程是同时进行的。


2.两个线程同时修改同一个变量


  当两个线程同时修改一个变量时,会存在运算被覆盖的情况。

如代码:

public class Deome4 {private  static int count = 0;public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()-> {for(int i = 0; i < 10000; i++){count++;}});Thread t2 = new Thread(()-> {for(int i = 0; i < 10000; i++){count++;}});t1.start();t2.start();t1.join();t2.join();System.out.println(count);}
}

如图:

上述代码,如果按照步骤应该是 20000, 但这里结果不是,这里就存在了问题。

主要是因为 在对 count++的时候,共分为3个步骤,因为线程的抢占式执行,导致有的值被覆盖掉了,所以不一样。


3.修改操作不是原子的


  咱们就拿 count++ 为例,

count++ 分为3个步骤:

load:把内存中的数据读取到寄存器中。

add:把寄存器中的数据加1。

save:把寄存器中的值写入到内存中。

这里的原子性就是指不可拆分。

因为这里不是原子性的,着里线程随机调度,就会中出现错误。


4.内存可见性问题

  什么是内存可见性问题呢?

如代码:

public class Deome4 {private  static int count = 0;public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()-> {while(count == 0){;}System.out.println("t1 循环结束");});Thread t2 = new Thread(()-> {Scanner sc = new Scanner(System.in);count = sc.nextInt();});t1.start();t2.start();t1.join();t2.join();System.out.println(count);}
}

如图:

按道理来说我如果这里输入的是1,那么代码应该就结束的,但是这里并没有结束,此时就是内存可性问题。

这里是因为,我们的load的执行速度相比于cmp慢了太多了。此时JVM就做出来一个非常大胆的决定--不再真正的去重复load了,因为判定好像没人去修改count的值,所以干脆就只获取一次就好了,此时就出现了前面运行的情况了。


以上是线程安全问题的4种原因。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三防平板定制服务:亿道信息与个性化生产的紧密结合

在当今数字化时代&#xff0c;个性化定制已经成为了市场的一大趋势&#xff0c;而三防平板定制服务作为其中的一部分&#xff0c;展现了数字化技术与个性化需求之间的紧密结合。这种服务是通过亿道信息所提供的技术支持&#xff0c;为用户提供了满足特定需求的定制化三防平板&a…

云原生安全当前的挑战与解决办法

云原生安全作为一种新兴的安全理念&#xff0c;不仅解决云计算普及带来的安全问题&#xff0c;更强调以原生的思维构建云上安全建设、部署与应用&#xff0c;推动安全与云计算深度融合。所以现在云原生安全在云安全领域越来受到重视&#xff0c;云安全厂商在这块的投入也是越来…

算法设计与分析(实验6)---最短增益路径法求解最大流问题

一&#xff0e;实验目的 掌握最大流算法思想。学会用最大流算法求解应用问题。 二&#xff0e;实验步骤与结果 1.上述问题可按最大流问题求解&#xff1a; 假设有医生n个&#xff0c;现要安排元旦&#xff08;共D’天&#xff09;和五一&#xff08;共D’’天&#xff09;的…

ChatGPT基础(一) GPT的前世今生

文章目录 GPT模型简史GPT系列模型ChatGPT的应用 最近ChatGPT3.5可以免注册使用了&#xff0c;出来刨一波坟 说一说ChatGPT的来源和应用。 GPT模型简史 Generative pre-trained transformers(GPT)生成式预训练转换模型是大语言模型的一种(Large Language Model–>LLM)。它是…

如何在 Windows 上安装 Jupyter Notebook?

Jupyter Notebook 是一个开源 Web 应用程序&#xff0c;可用于创建和共享包含实时代码、公式、可视化效果和叙述文本的文档。用途包括数据清理和转换、数值模拟、统计建模、数据可视化、机器学习等 在本文中&#xff0c;我们将看到使用 pip 安装在Windows上安装 Jupyter Noteb…

Java8关于Function接口

Java学习-Function接口 1 函数式接口简介和学习地址2 两种常见的函数式接口2.1 Runnable&#xff1a;执行接口&#xff0c;不接收参数&#xff0c;也无返回结果。2.2 Consumer&#xff1a;作为消费接口&#xff0c;接收一个参数&#xff0c;无返回结果。 3 初识3.1 定义Functio…

系统架构评估_2.SAAM方法

SAAM&#xff08;Scenarios-based Architecture Analysis Method&#xff09;是卡耐基梅隆大学软件工程研究所&#xff08;SEI at CMU&#xff09;的Kazman等人于1983年提出的一种非功能质量属性的架构分析方法&#xff0c;是最早形成文档并得到广泛使用的软件架构分析方法。最…

MySQL基础练习题:创建数据库

这部分主要是为了帮助大家回忆回忆MySQL的基本语法&#xff0c;数据库来自于MySQL的官方简化版&#xff0c;题目也是网上非常流行的35题。这些基础习题基本可以涵盖面试中需要现场写SQL的问题。 创建数据库 在开始练习之前&#xff0c;我默认你的电脑上是没有本系列练习题需要…

物联网可视化平台

随着数字化转型的深入&#xff0c;物联网技术正在成为企业实现智能化、高效化运营的重要工具。物联网可视化平台&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;为企业提供了直观、实时的数据展示和监控能力&#xff0c;从而在数字化转型中扮演着关键角色。 一、物…

内外网数据交换发展进程:安全与便捷并行

随着信息化的不断推进&#xff0c;医院、党政以及企业的内外网数据交换正成为日益关注的焦点。在保障数据安全的前提下&#xff0c;需要寻求一种既安全可靠又操作便捷的数据传输方式。本文将探讨内外网数据交换发展进程&#xff0c;分析各种传输方式的优缺点&#xff0c;以及它…

HG-SL:基于全局和局部用户行为的新闻

一、概述 本文的主要目标是&#xff0c;仅通过用户行为来判断新闻的真伪。其之所以抛弃传统的基于视频内容、用户反馈&#xff08;点赞和评论&#xff09;等信息&#xff0c;是认为&#xff0c;这些内容很容易存在造假的情况&#xff08;即有水军机器人操控&#xff09;。而基于…

css anminate 加载中三个点点动态出现

期待效果&#xff1a; 核心代码&#xff1a; css3 anminate方法 //html <div>加载中<span id"dot">...</span></div>//css <style>   #dot {display: inline-block;width: 1.5em;vertical-align: bottom;overflow: hidden;animati…