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

多线程与并发编程

Java 多线程与并发编程

很多人学并发:

  • 一上来就背八股
  • synchronized
  • CAS
  • AQS
  • volatile
  • JUC

结果:

背了一堆。

问:

“为什么会线程不安全?”

直接卡死。

其实并发编程最重要的是:

建立整体认知。

这篇从:

  • 线程
  • CAS
  • AQS
  • volatile
  • ThreadLocal
  • 线程池

一路讲到面试常问。

尽量人话。


一、线程与进程的区别


1. 资源分配和调度单位

进程:

是操作系统资源分配的基本单位。

线程:

是 CPU 调度的基本单位。

简单理解:

进程 = 公司 线程 = 员工

一个进程里:

可以有多个线程。


2. 地址空间

不同进程:

内存隔离。

每个进程都有自己的:

  • 页表
  • 虚拟内存

线程:

共享进程资源。

包括:

  • 方法区
  • 全局变量

但线程有自己的:

  • 程序计数器
  • 寄存器

3. 通信方式

进程通信:

需要 IPC:

  • 管道
  • socket
  • 消息队列
  • 共享内存

线程:

因为共享内存。

直接读变量即可。


4. 创建和切换开销

进程:

切换时:

需要切换地址空间。

开销大。

线程:

共享地址空间。

切换轻很多。


5. 稳定性

进程之间互相隔离。

一个进程崩:

一般不会影响别的进程。

线程:

共享内存。

一个线程乱写:

整个进程都可能寄。


二、为什么进程创建和销毁开销大?


1. 独立虚拟内存

每个进程都需要:

  • 页表
  • PCB

创建时:

都要重新初始化。


2. 地址空间切换

进程切换:

需要:

  • 切页表
  • 刷TLB
  • 切MMU映射

线程很多时候不需要。


3. 资源回收复杂

进程结束:

需要回收:

  • 文件
  • socket
  • 内存

三、平台线程与虚拟线程


1. 平台线程

传统 Java 线程。

1:1 对应 OS线程。

Java Thread = OS Thread

特点:

  • 栈内存大
  • 创建数量有限

2. 虚拟线程

Java21 正式推出。

虚拟线程:

是 JVM 管理的轻量线程。

适合:

高并发 IO 场景。


原理

传统线程:

线程执行IO ↓ 线程阻塞 ↓ OS线程被占住

虚拟线程:

虚拟线程执行IO ↓ JVM挂起虚拟线程 ↓ 平台线程继续执行别的任务

所以:

虚拟线程本质:

是减少 OS线程浪费。


四、Java线程创建方式


1. 继承 Thread

classMyThreadextendsThread{publicvoidrun(){}}

2. Runnable

推荐。

classTaskimplementsRunnable{publicvoidrun(){}}

3. Callable + FutureTask

支持:

  • 返回值
  • 异常

4. 线程池

实际开发最常用。


五、线程状态


1. NEW

未启动。


2. RUNNABLE

运行或等待CPU。


3. BLOCKED

等待锁。


4. WAITING

无限等待。


5. TIMED_WAITING

限时等待。


6. TERMINATED

结束。


六、sleep 和 wait 的区别


1. sleep 不释放锁


2. wait 释放锁


3. wait 必须在 synchronized 中调用

否则:

IllegalMonitorStateException

4. wait 需要 notify 唤醒


七、线程通信方式


1. 共享变量


2. volatile

保证:

  • 可见性

不保证:

  • 原子性

3. wait / notify

线程协作。


4. BlockingQueue

生产者消费者核心。


八、为什么会线程不安全?

本质:

多个线程同时修改共享资源。

比如:

count++

实际:

读取 修改 写回

不是原子操作。


九、synchronized详解

这是 Java 最经典的锁。


1. synchronized怎么用?


修饰普通方法

publicsynchronizedvoidtest(){}

锁的是:

当前对象。

即:

this

修饰静态方法

publicstaticsynchronizedvoidtest(){}

锁的是:

Class对象

修饰代码块

synchronized(lock){}

锁指定对象。


2. synchronized底层原理

本质:

对象监视器:

Monitor

JVM通过:

monitorenter monitorexit

实现加锁解锁。


3. synchronized支持重入吗?

支持。

synchronized(this){synchronized(this){}}

同线程可重复获得锁。


4. synchronized 是公平锁吗?

不是。

属于:

非公平锁。


5. synchronized 可以锁字符串吗?

可以。

但不推荐。

比如:

synchronized("abc")

字符串常量池可能导致:

莫名锁竞争。

抽象的一批。


6. synchronized 锁升级过程

JDK6后优化很大。

锁会升级:

无锁 ↓ 偏向锁 ↓ 轻量级锁 ↓ 重量级锁

偏向锁

默认偏向第一个线程。

减少CAS。


轻量级锁

线程竞争不激烈。

采用:

CAS自旋。


重量级锁

竞争严重。

线程阻塞。

OS介入。


7. JVM对synchronized做了什么优化?


锁粗化

多个连续加锁:

合并。


锁消除

JIT发现:

没有竞争。

直接去掉锁。


自旋锁

避免线程立即阻塞。


偏向锁

减少无竞争成本。


十、volatile详解


1. volatile有什么作用?

保证:

  • 可见性
  • 有序性

不保证:

  • 原子性

2. 什么是可见性?

线程修改变量后。

别的线程立刻能看到。


3. 什么是有序性?

防止指令重排序。


4. volatile如何实现?

底层:

内存屏障。


5. volatile能保证线程安全吗?

不能。

count++

仍然线程不安全。


6. volatile 和 synchronized 区别

对比volatilesynchronized
原子性不保证保证
可见性保证保证
有序性保证保证
性能较低

十一、CAS详解


1. 什么是CAS?

Compare And Swap。

比较并交换。

CPU原子指令。


2. CAS流程

V = A ? 是: 修改成B 否: 失败重试

3. CAS有什么问题?


ABA问题

值:

A → B → A

CAS会认为没变化。


自旋开销大

一直失败会疯狂循环。


只能保证单变量原子性


4. 如何解决ABA问题?

使用:

AtomicStampedReference

加版本号。


十二、AQS详解

AQS:

AbstractQueuedSynchronizer

JUC核心。


1. AQS是什么?

一个:

队列同步器。

很多锁都基于它:

  • ReentrantLock
  • CountDownLatch
  • Semaphore

2. AQS核心思想

维护:

volatileintstate

通过:

CAS修改state。

失败线程:

进入队列等待。


3. AQS底层结构

CLH双向队列。


十三、ReentrantLock


1. ReentrantLock 和 synchronized区别


ReentrantLock功能更多

支持:

  • 公平锁
  • 可中断
  • 超时
  • Condition

synchronized更简单

JVM级别优化。


2. 公平锁和非公平锁


公平锁

先来先得。


非公平锁

允许插队。

吞吐量更高。


十四、ThreadLocal


1. ThreadLocal是什么?

线程局部变量。

每个线程:

独立副本。


2. ThreadLocal原理

每个线程内部:

有:

ThreadLocalMap

3. 为什么key是弱引用?

避免:

ThreadLocal无法回收。


4. 为什么还会内存泄漏?

key被回收:

value可能还在。

如果线程池线程不结束:

value可能一直存在。


5. 如何避免?

使用后:

remove()

十五、线程池详解

这是面试高频。


1. 为什么使用线程池?

避免:

频繁创建销毁线程。


2. ThreadPoolExecutor核心参数


corePoolSize

核心线程数。


maximumPoolSize

最大线程数。


keepAliveTime

空闲线程存活时间。


workQueue

任务队列。


threadFactory

线程工厂。


rejectHandler

拒绝策略。


3. 线程池执行流程

任务来了 ↓ 核心线程没满 → 创建核心线程 ↓ 核心线程满 → 进入队列 ↓ 队列满 → 创建非核心线程 ↓ 线程也满 → 拒绝策略

4. 拒绝策略有哪些?


AbortPolicy

默认。

直接抛异常。


CallerRunsPolicy

调用者自己执行。


DiscardPolicy

直接丢弃。


DiscardOldestPolicy

丢弃最旧任务。


5. 为什么不推荐 Executors?

因为:

可能导致:

OOM。

比如:

newFixedThreadPool

队列:

无界。


6. 线程池参数怎么设置?

CPU密集型:

CPU核数 + 1

IO密集型:

CPU核数 * 2

或者更高。


十六、死锁


1. 什么是死锁?

多个线程互相等待资源。

谁也不释放。


2. 死锁四个条件


互斥


请求保持


不可剥夺


循环等待


3. 如何避免死锁?


固定加锁顺序


超时机制


减少锁嵌套


十七、并发容器


1. ConcurrentHashMap

JDK8:

  • CAS
  • synchronized

实现。


2. CopyOnWriteArrayList

读写分离。

适合:

读多写少。


3. BlockingQueue

阻塞队列。

线程池核心。


十八、悲观锁和乐观锁


1. 悲观锁

认为:

一定会冲突。

直接加锁。

比如:

synchronized ReentrantLock

2. 乐观锁

认为:

不一定冲突。

CAS重试。


十九、总结

并发编程核心:

其实就三件事:


1. 资源共享

多个线程如何共享数据。


2. 线程调度

CPU怎么切换线程。


3. 数据安全

如何避免:

  • 数据错乱
  • 死锁
  • 可见性问题

很多高级并发框架。

底层逃不过:

  • CAS
  • AQS
  • volatile
  • synchronized

理解这些。

后面看源码才不会像看天书。

http://www.jsqmd.com/news/810513/

相关文章:

  • 在Windows上优雅处理PDF:Poppler工具包让你的文档工作更轻松
  • 嵌入式开发云端化:架构模式、实战评估与核心挑战解析
  • 风力叶片机器人喷涂轨迹规划仿真【附模型】
  • 利用Taotoken模型广场为不同项目选择合适大模型的策略
  • AI助手本地化办公:officecli-skills实现文档自动化生成
  • C/C++项目里stb_image库的‘multiple definition’报错,我用STB_IMAGE_STATIC宏解决了
  • 2026年金融AI投研炒股工具横评:五大主流平台深度对比推荐 - 品牌种草官
  • 【技术底稿 33】同机复用开发资源,搭建完整测试环境实战复盘一、核心背景
  • 基于Git工作流的OpenClaw状态备份工具clawsync设计与实践
  • 【仅限前500名】NotebookLM RAG私有化调优套件泄露版:含17个生产环境验证的prompt-sql混合检索模板+Latency-SLA监控看板
  • Python WebSocket 实时通信实战:构建实时Web应用
  • 告别答辩PPT焦虑:百考通AI一键生成,高效备战毕业答辩
  • AI时代的战神金刚——构建你的外部大脑与商业闭环@围巾哥萧尘
  • 【AI响应速度生死线】:Haiku在实时客服/编程助手/边缘设备的3大不可替代性验证
  • NotebookLM播客生成质量暴跌真相:训练数据污染率高达18.7%?我们逆向拆解了其RAG音频对齐层
  • LabVIEW主要设计特性与工程价值
  • STM32实战:BMP280气压模块IIC驱动与数据精准采集
  • 不靠感觉写代码:Matt Pocock 的 Skills 如何让 AI 写出你真正想要的代码
  • 半导体行业周期解析:从供需失衡到产业链博弈的生存指南
  • 终极音乐解锁指南:免费工具让你在任何设备播放加密音乐
  • 从底层逻辑了解AI
  • 基于SimpleX协议构建私有AI通信通道:OpenClaw插件部署指南
  • 氛围工程指南:如何量化与塑造技术团队的健康氛围
  • gptstudio:R语言数据分析的AI副驾驶,重塑RStudio工作流
  • 【ChatGPT Slogan生成黄金法则】:20年品牌技术专家亲授3步高转化文案炼金术
  • 假冒 TronLink 的 MV3 扩展钓鱼攻击机理与 Web3 钱包安全防御
  • 隐私保护机器学习技术:MPC与FHE对比与应用
  • 快速原型开发中利用Taotoken分钟级接入验证创意
  • PS图片文字修改教程 简单几步完美替换文字内容
  • 137.从 CUDA 环境到模型部署!YOLOv8 全流程实战,适配工业质检 / 自动驾驶多场景