news 2026/5/1 10:07:43

java--线程安全问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java--线程安全问题

概念:Java线程安全问题,本质上是在多线程环境下,由于线程调度的不确定性,导致程序的执行结果与预期不符。

线程安全问题的产生通常可以归结为以下三个核心原因:

  1. 原子性问题 (Atomicity)
    一个看似简单的操作(如count++),在底层实际上包含了读取、修改、写入三个步骤。如果这些步骤没有作为一个不可分割的整体(即原子操作)来执行,就可能被其他线程打断。例如,两个线程同时对一个变量进行自增,可能因为操作交错,导致最终结果只增加了一次。

  2. 可见性问题 (Visibility)
    根据Java内存模型(JMM),每个线程都有自己的工作内存(类似于CPU缓存),保存了主内存中共享变量的副本。一个线程对变量的修改可能只更新到了自己的工作内存中,而没有及时刷新回主内存,导致其他线程无法看到最新的值。

  3. 有序性问题 (Ordering)
    为了优化性能,编译器或处理器可能会对指令的执行顺序进行重排(Instruction Reordering)。虽然在单线程下这不会有问题,但在多线程环境下,这种重排可能导致一个线程看到的操作顺序与代码编写的顺序不一致,从而引发错误。

这里主要介绍12两者以及对应解决方法

1.使用synchronized关键字:它可以保证代码块或方法的原子性可见性。同一时刻只有一个线程能进入被synchronized修饰的代码区域,其他线程必须等待。

(原子操作:简单来说,原子操作就是指一个操作在执行过程中不会被线程调度机制打断)

2.使用volatile关键字:它主要用于保证变量的可见性有序性(禁止指令重排),但不保证操作的原子性。

下面以两个程序展示用法:

【1】synchronized

添加synchronized关键字后,同步代码块执行后输出结果为20000,若不加synchronized锁,结果偏小

package Thread_Learning; /** * @author jinhuang * @date 2026/2/5 9:59 * @description */ public class ThreadDemo1 extends Thread{ static int count=0; static Object lockobj=new Object(); @Override public void run() { for (int i = 0; i < 10000; i++) { //同步代码块 synchronized(lockobj){ count++; } } } public static void main(String[] args) { ThreadDemo1 t1=new ThreadDemo1(); ThreadDemo1 t2=new ThreadDemo1(); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println(count); } }

【2】volatile

// 具备可见性,当一个线程修改之后,另一个线程可以立马更新
// 被这个词修饰的变量在每次使用时都会更新 查看堆内存的数据是否更改

若没有volatile关键字,无法正常执行完A程序

package Thread_Learning; /** * @author jinhuang * @date 2026/2/5 10:06 * @description */ class ThreadDemo3 extends Thread{ ThreadDemo2 td2; @Override public void run() { System.out.println("线程B启动!"); td2.isflag=true; System.out.println("线程B执行完成!"); } } public class ThreadDemo2 extends Thread{ volatile boolean isflag; @Override public void run() { System.out.println("线程A启动!"); while (true){ if(isflag){ break; } } System.out.println("线程A执行完成!"); } public static void main(String[] args) { ThreadDemo2 t2=new ThreadDemo2(); ThreadDemo3 t3=new ThreadDemo3(); t3.td2=t2; t2.start(); t3.start(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 8:12:54

探索六轴EtherCAT总线伺服涂布收卷机程序的奇妙世界

六轴EtherCAT总线伺服涂布收卷机程序&#xff0c;采用六个伺服变频器编码器&#xff0c;动态测量频率&#xff0c;计算转速&#xff0c;再换算频率&#xff0c;用变频器同步伺服电机速度&#xff0c;进行通讯控制&#xff0c;具备一定参考价值。 在自动化控制领域&#xff0c;六…

作者头像 李华
网站建设 2026/5/1 8:12:23

*终端渲染天花板:isoneback小函数诞生记——ai终端渲染状态机设定编码序列re解析复杂实现催生我的简洁创造

智能复杂惹不甘&#xff0c;搜肠刮肚终成篇。 笔记模板由python脚本于2026-02-04 11:42:16创建&#xff0c;本篇笔记适合不满代码表达繁复的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 Python官…

作者头像 李华
网站建设 2026/5/1 8:12:52

【技术管理的第一次转身】从问题感知到方案落地

高效能人士与普通人的核心差异&#xff0c;往往不在于解决问题的能力&#xff0c;而在于发现、定义和系统化分析问题的能力。一、问题意识&#xff1a;一切改进的起点 解决问题的第一步&#xff0c;是意识到问题的存在。培养敏锐的“问题意识”&#xff0c;是提升个人与团队效能…

作者头像 李华
网站建设 2026/5/1 10:01:15

西门子PLC博途:三种自动流程程序写法大揭秘

西门子PLC博途3种自动流程程序写法 本案例介绍3种不同的方法去写自动流程程序。 第一种是用scl case语录&#xff0c;另外的两种使用梯形图的模式去写。 使用此类方法去写&#xff0c;清晰明了&#xff0c;非常使用。 并且针对程序配有视频解说&#xff0c;轻松上手 在西门子P…

作者头像 李华
网站建设 2026/5/1 4:42:33

Win11 临时文件清理实战

目录 一、什么是 Win11 的“临时文件”&#xff1f;为什么会越积越多&#xff1f; 二、方法一&#xff1a;使用 Win11 官方推荐的「存储感知」清理&#xff08;新手首选&#xff09; 操作步骤 常见可勾选项说明&#xff08;重点&#xff09; 清理效果 三、方法二&#xff…

作者头像 李华
网站建设 2026/5/1 4:45:39

闭眼入AI论文软件,千笔 VS 锐智 AI,本科生写作首选!

随着人工智能技术的迅猛发展&#xff0c;AI辅助写作工具已逐渐成为高校学生完成毕业论文的重要助手。越来越多的学生开始借助这些工具提升写作效率、优化内容结构&#xff0c;尤其是在开题报告、文献综述和正文撰写等环节中&#xff0c;AI的介入让原本繁琐的学术写作变得更加高…

作者头像 李华