news 2026/3/13 11:31:38

【多线程理论基础】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【多线程理论基础】

多线程理论基础

1. 多线程的出现是要解决什么问题?

多线程的核心目标是提升程序效率和资源利用率,主要解决三类场景的痛点:

  • CPU利用率问题:对于CPU密集型任务(如计算、排序),多线程可以让多核CPU并行工作,避免单线程浪费CPU核心资源。
  • IO阻塞问题:对于IO密集型任务(如网络请求、文件读写),一个线程等待IO时,其他线程可以继续执行,避免整个程序被阻塞。
  • 响应性问题:在GUI、Web服务等场景中,多线程可以让主线程保持响应(如界面不卡顿),后台线程处理耗时任务。

例子:电商系统中,主线程处理用户请求,后台线程异步生成订单日志,既保证了接口响应速度,又不丢失日志数据。


2. 线程不安全是指什么?举例说明

线程不安全是指多个线程并发操作共享资源时,因缺乏正确的同步机制,导致数据出现不一致或逻辑错误的情况

经典例子:计数器问题

publicclassUnsafeCounter{privateintcount=0;publicvoidincrement(){count++;// 非原子操作:读取→加1→写入}publicintgetCount(){returncount;}}

当两个线程同时调用increment()时,可能出现:

  • 线程A读取count=0,加1到1(未写入主存);
  • 线程B读取count=0,加1到1(未写入主存);
  • 最终两个线程都写入主存,count=1(预期是2),导致数据不一致。

3. 并发出现线程不安全的本质:可见性、原子性和有序性问题

线程不安全的根源是多线程环境下,共享变量的操作违反了原子性、可见性或有序性

  • 原子性:一个操作是不可分割的,要么全执行,要么不执行。如count++不是原子操作,会被拆分为三步,导致中间状态被其他线程干扰。
  • 可见性:一个线程修改了共享变量后,其他线程能立刻看到最新值。因CPU缓存存在,线程A修改的变量可能先存在缓存里,未刷到主存,线程B读的还是旧值。
  • 有序性:程序执行顺序按代码逻辑执行,但JVM会做指令重排(单线程下安全,多线程下可能导致逻辑混乱)。如双重检查锁单例模式,指令重排可能导致半初始化的对象被其他线程获取。

4. Java是怎么解决并发问题的?3个关键字,JMM和8个Happens-Before

核心解决手段:
  • 3个关键字

    1. synchronized:保证原子性、可见性、有序性。通过互斥锁保证同一时间只有一个线程执行同步代码块,同时刷新缓存到主存,禁止指令重排。
    2. volatile:保证可见性和有序性,不保证原子性。强制变量修改后刷到主存,读取时从主存获取,禁止指令重排(如修饰状态标记flag)。
    3. final:保证初始化完成后的可见性。被final修饰的变量,初始化完成后其他线程能立刻看到其值,且不可被修改。
  • JMM(Java内存模型)
    定义了线程工作内存(缓存)与主存的交互规则,通过内存屏障(Memory Barrier)保证可见性和有序性,解决缓存一致性和指令重排问题。

  • 8个Happens-Before(先行发生)规则
    这是JMM的核心规则,用来判断多线程操作的执行顺序是否可见:

    1. 程序次序规则:单线程内,前面的操作先行发生于后面的操作。
    2. 管程锁定规则:对一个锁的unlock操作先行发生于后面对同一个锁的lock操作。
    3. volatile变量规则:对volatile变量的写操作先行发生于后面对该变量的读操作。
    4. 线程启动规则Thread.start()先行发生于线程内的任何操作。
    5. 线程终止规则:线程内的任何操作先行发生于其他线程检测到该线程终止(如Thread.join())。
    6. 线程中断规则:对线程interrupt()的调用先行发生于被中断线程检测到中断事件。
    7. 对象终结规则:对象的构造函数执行完成先行发生于它的finalize()方法。
    8. 传递性:若A先行发生于B,B先行发生于C,则A先行发生于C。

5. 线程安全是不是非真即假?不是

线程安全不是绝对的“是/否”,而是有程度差异的,分为四类:

  • 绝对线程安全:无论怎么使用,都不会出现线程安全问题(如ConcurrentHashMap的部分场景,但这类极少)。
  • 相对线程安全:单个方法是线程安全的,但组合操作(如“先get再set”)需要额外同步(如Vector,其get()size()单独安全,但组合使用可能数组越界)。
  • 线程兼容:本身不是线程安全的,但可以通过外部同步保证安全(如ArrayList,用synchronized包裹操作)。
  • 线程对立:无论怎么同步,都无法在多线程下安全使用(如废弃的Thread.stop(),会导致资源泄漏)。

6. 线程安全有哪些实现思路?

核心有三类实现方案:

  • 互斥同步(悲观锁):通过锁保证同一时间只有一个线程执行临界区代码,如synchronizedReentrantLock
  • 非阻塞同步(乐观锁):通过CAS(Compare-And-Swap)硬件指令保证原子性,不需要锁,性能更高,如AtomicInteger
  • 无同步方案:如果操作不需要共享资源,或资源是线程私有(如ThreadLocal)、不可变对象(如StringInteger),则无需同步。

7. 如何理解并发和并行的区别?

  • 并发(Concurrency)同一时间段内交替执行多个任务,宏观上“同时进行”,微观上是CPU在任务间快速切换(如单核CPU处理多线程)。
    例子:一个厨师同时处理多个订单,切菜、炒菜交替进行,看起来同时在做多个菜,但同一时间只在做一个步骤。
  • 并行(Parallelism)同一时刻同时执行多个任务,真正的“同时进行”,依赖多核CPU(如多核CPU上,每个核心执行一个线程)。
    例子:多个厨师同时炒菜,每个厨师做一个菜,同一时刻多个菜在炒。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/12 21:42:48

PoeCharm实战指南:3步解决流放之路BD构建难题

PoeCharm实战指南:3步解决流放之路BD构建难题 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm 你是否曾经在流放之路中投入大量通货,却发现角色DPS始终无法突破百万大关&…

作者头像 李华
网站建设 2026/3/12 10:07:27

IDM软件试用期管理技术方案

IDM软件试用期管理技术方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 技术背景与原理 Internet Download Manager(IDM)作为一款专业…

作者头像 李华
网站建设 2026/3/4 22:42:02

HY-MT1.5-7B深度解析|33语种互译与术语干预技术落地实践

HY-MT1.5-7B深度解析|33语种互译与术语干预技术落地实践 1. 引言:机器翻译的效率与质量博弈 在大模型普遍追求千亿参数规模的背景下,腾讯混元团队推出的 HY-MT1.5 系列翻译模型另辟蹊径,聚焦于“小而精”的专业机器翻译&#xf…

作者头像 李华
网站建设 2026/3/9 21:40:52

什么是SDN

文章目录为什么需要SDNSDN架构SDN的优点SDN与NFV有什么区别SDN的未来与挑战华为SDN解决方案软件定义网络(Software-defined Networking,简称SDN)技术是一种网络管理方法,它支持动态可编程的网络配置,提高了网络性能和管…

作者头像 李华
网站建设 2026/3/1 18:56:21

AI印象派艺术工坊性能基准测试:不同设备运行效果

AI印象派艺术工坊性能基准测试:不同设备运行效果 1. 技术背景与测试目标 随着边缘计算和本地化AI应用的兴起,轻量级、高性能的图像处理工具成为开发者和创作者关注的重点。传统的风格迁移方案多依赖深度神经网络模型,如StyleGAN或Transform…

作者头像 李华
网站建设 2026/3/13 7:21:16

从0开始学AI数学推理:DeepSeek-R1-Distill-Qwen-1.5B入门指南

从0开始学AI数学推理:DeepSeek-R1-Distill-Qwen-1.5B入门指南 你是否正在寻找一个轻量级但具备强大数学推理能力的AI模型?参数仅1.5B却能在MATH-500数据集上实现83.9%通过率的模型是否存在?本文将带你从零开始,全面掌握 DeepSeek…

作者头像 李华