当前位置: 首页 > article >正文

JavaEE-线程安全专题

文章目录

  • 线程安全概述
    • 线程安全引入
    • 线程不安全原因概述
  • 线程是随机调度的

线程安全概述

线程安全引入

线程安全问题是整个多线程专题的最核心也是最重要的章节, 如果不理解线程的安全, 是无法写出正确的多线程的代码的, 我们之前所写的代码都是在单一的线程环境之下写出的 “玩具式” 的代码, 不存在多线程的复杂关系, 下面我们给出一段代码来引出线程安全的话题…


public class ThreadTest {
    // 定义一个计数器
    private static int count = 0;

    // 定义一个循环的次数
    private static final int MAX_TIME = 50000;

    public static void main(String[] args) throws InterruptedException {
        // 重置计数器count
        count = 0;
        // 创建线程t1
        Thread t1 = new Thread(() -> {
            for(int i = 0; i < MAX_TIME; i++){
                count++;
            }
        });
        // 创建线程t2
        Thread t2 = new Thread(() -> {
            for(int i = 0; i < MAX_TIME; i++){
                count++;
            }
        });

        // 开启线程t1, t2
        t1.start();
        t2.start();
        // main线程等待t1, t2 的执行
        t1.join();
        t2.join();
        System.out.println("运行结果" + count);
    }
}

我们上述代码想要完成的逻辑是

  • 想通过两个线程把count的值置为10_0000

但是实际上, 运行结果是

在这里插入图片描述
在这里插入图片描述

可以发现, 运行结果跟我们的预期的结果不一致, 这其实就是线程安全问题


线程安全问题:
在多线程环境下, 如果实际运行的结果与预期不一致, 就说明存在线程安全问题, 或者说线程不安全


线程不安全原因概述

  • 线程是并发执行的, 在cpu上的调度的随机的…[根本原因]
  • 多个线程同时修改同一个变量
  • 修改操作不是原子性的
  • 内存可见性问题
  • 指令重排序问题

第一条的关于cpu的调度问题, 我们是没有办法干预的, 因为这是操作系统层面的事情, cpu是随机调度的, 而不是串行执行, 如果是串行执行则不会出现这种线程安全相关的问题
所以我们只能从后四个进行关于线程安全的处理

线程是随机调度的

这是线程安全问题的最根本的原因, 因为我们的程序在cpu上的执行是随机调度的, 所以天然的程序执行就不是连续的, 想要解决这种问题的方法就是, 重写一个操作系统(对线程的调度模式进行重新设计, 这显然是不合理的…)


http://www.kler.cn/a/408204.html

相关文章:

  • 虚幻引擎---术语篇
  • Spring ApplicationListener
  • 【LLM】一文学会SPPO
  • 传奇996_32——npc及怪物顶戴花翎
  • 【SKFramework框架】一、框架介绍
  • Oracle 19c Rac + ADG搭建(源库:RAC,目标库FS)
  • Tessy学习笔记—一些零散知识点
  • 昇腾CANN环境下Whisper.cpp安装指南
  • Windows 软件之 FFmpeg
  • Pytorch使用手册-Save and Load the Model(专题八)
  • 亚太杯数学建模竞赛介绍
  • 11.21作业
  • 【jvm】AOT编译器
  • git仓库推送到远端
  • window系统下使用open-webui+ollama部署大模型
  • LCR-003比特位计数
  • 电子电气架构 -- ASIL D安全实现策略
  • STM32ADC独立模式单通道采集实验
  • Creo 6.0 软件安装教程下载
  • 非线性控制器设计原理
  • c++应用网络编程之十五Nagle算法
  • flowable流程图详细绘制教程
  • 基于YOLOv8深度学习的智慧农业果园果树苹果类果实目标检测系统(PyQt5界面+数据集+训练代码)
  • shell脚本(6)
  • 【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列
  • 美年健康集团发布“共建共享高质量职场健康管理宣言”,全面启动“高质量职场健康先行试点工作”