0

0

Java并发编程中什么是线程安全_核心原理说明

P粉602998670

P粉602998670

发布时间:2026-01-25 13:40:02

|

419人浏览过

|

来源于php中文网

原创

线程安全指多线程访问共享资源时行为符合预期、结果确定且无数据污染;i++因非原子性(读-改-写三步)、可见性缺失和有序性错乱而不安全;volatile仅解决前两者,synchronized通过Monitor实现原子性、可重入与自动释放;AtomicInteger基于CAS适用于单变量原子操作,但不支持多步协同;根本难点在于识别隐式共享与合理控制锁粒度。

java并发编程中什么是线程安全_核心原理说明

线程安全不是“加了锁就安全”,而是指多个线程同时访问同一对象或变量时,**程序行为始终符合预期,结果确定、无数据污染**。比如一个计数器被 10 个线程各加 100 次,最终必须是 1000 —— 少了,就是不安全;多了,也是不安全。

为什么 i++ 不是线程安全的?

表面看是一行代码,实际分三步:读取 i计算 i+1写回 i。两个线程可能同时读到 i = 5,都算出 6,再都写回去,结果还是 6(本该是 7)。这就是原子性被破坏。

  • 可见性缺失:线程 A 修改了 count,但没及时刷到主内存,线程 B 还在用自己缓存的老值
  • 有序性错乱:JVM 或 CPU 可能重排序指令,比如把“初始化对象”和“发布引用”调换顺序,导致其他线程看到未构造完成的对象(典型单例双重检查锁漏洞)
  • volatile 能解决可见性和有序性,但不能修复 i++ 这种复合操作的原子性

synchronized 怎么真正起作用?

它背后是 JVM 的监视器(Monitor)机制:每个 Java 对象都关联一个 Monitor,monitorentermonitorexit 字节码控制进入/退出。一旦某个线程拿到锁,其他线程只能排队等待。

  • 修饰实例方法 → 锁的是 this 对象
  • 修饰静态方法 → 锁的是 ClassName.class
  • 修饰代码块 → 可指定任意对象作锁,更灵活,也更易避免锁粒度过大
  • 支持可重入:同一线程可重复获取同一把锁,不会死锁
  • 自动释放:无论正常结束还是抛异常,锁都会释放(这点比 ReentrantLock 更省心)

AtomicInteger 替代锁,靠谱吗?

靠谱,但只适用于“单一变量的简单操作”。它底层靠 CPU 的 CAS(Compare-And-Swap)指令实现无锁并发,比如 incrementAndGet() 是原子的,不会丢更新。

Glimmer Ai
Glimmer Ai

基于GPT-3和DALL·E2的PPT制作工具

下载

立即学习Java免费学习笔记(深入)”;

  • 优势:无锁、无上下文切换开销,高并发低竞争场景性能明显优于 synchronized
  • 局限:无法用于多变量协同逻辑(如“先查余额,够才扣款”这种两步操作),CAS 会失败重试,高竞争下可能自旋耗 CPU
  • 别误用:volatile int count + count++ 仍是线程不安全的 —— volatile 不保原子性

真正难的从来不是“怎么加锁”,而是判断哪些共享状态需要保护、锁的范围是否过宽、有没有隐式共享(比如传入的集合参数被多个线程共用)。线程安全问题往往在压测或上线后才暴露,因为竞态条件依赖于线程调度的偶然性 —— 这也正是它最危险的地方。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1031

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

612

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

334

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

76

2025.10.23

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

891

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

32

2025.12.06

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 81.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号