登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
一把锁的两种承诺:synchronized如何同时保证互斥与内存 ...
一把锁的两种承诺:synchronized如何同时保证互斥与内存可见性?
[ 复制链接 ]
捐催制
2025-9-24 11:05:59
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
在多线程环境中,临界区(Critical Section)是指一次只能由一个线程执行的代码段,这些代码通常涉及对共享资源(如变量、数据结构、文件或数据库连接)的访问或修改。临界区的存在是为了解决并发控制中的两大核心问题。
1)数据不一致性:如果多个线程同时对共享资源进行写操作,可能会破坏数据的完整性,导致其状态与预期不符。
2)竞态条件:程序的执行结果依赖于线程调度和执行的偶然顺序,这使得程序行为变得不可预测,难以调试。
为了保护临界区,Java提供了多种互斥(Mutual Exclusion)机制,其中synchronized关键字是最常用且强大的工具之一。
synchronized实现互斥的基础是Java中的每一个对象都可以作为锁,这个锁是排他的,在任意时刻只有两种状态:被占用和未被占用。当线程请求一个由其他线程持有的锁时,请求的线程会被阻塞,直到锁被释放。这种机制确保了在任何时刻,只有一个线程能够进入临界区执行代码。
synchronized 有两种使用方式。
1)synchronized修饰方法:锁是当前实例对象。它修饰的方法称为同步方法。
public synchronized void method() {
// ...
}
复制代码
2)synchronized修饰代码块:锁是synchronized括号里配置的对象。它修饰的代码块称为同步代码块。
public void method() {
synchronized (this) {
// ...
}
}
复制代码
synchronized与happens-before关系
在Java内存模型中,对synchronized关键字建立如下的happens-before关系:释放锁的操作happens-before之后对同一把锁的获取的锁操作。
class LockingExample {
int x = 0;
public synchronized void set() { // 1
x++; // 2
} // 3
public synchronized void get() { // 4
int i = x; // 5
// ......
} //6
}
复制代码
假设线程A执行set()方法,随后线程B执行get()方法。
假设线程A获取锁执行set()方法,在set()方法中,对共享变量x自增+1,然后释放锁。线程B获取锁执行get()方法,在get()方法中,读取变量x,并赋值给本地变量i,然后释放锁。根据happens-before规则,可以确定线程A对x的修改happens-before线程B对x的读取,从而保证了数据的一致性。
这个过程建立的happens-before关系可以分为3类。
1)程序次序规则:1 happens-before 2,2 happens-before 3;4 happens-before 5,5 happens-before 6;
2)监视器锁规则:3 happens-before 4;
3)happens-before的传递性规则: happens-before 5。
上述happens-before关系的图形化表现形式如下。
synchronized内存语义
synchronized释放锁的内存语义:当线程释放锁时,Java内存模型会把该线程对应的本地内存中的共享变量刷新到主内存中。
A线程释放锁后,共享数据的状态如图所示。
synchronized获取锁的内存语义:当线程获取锁时,Java内存模型会把该线程对应的本地内存置为无效。从而使得被监视器保护的临界区代码必须从主内存中读取共享变量。
B线程释放锁后,共享数据的状态如图所示。
对比锁释放-获取与volatile写-读的内存语义可以看出:锁释放与volatile写有相同的内存语义;锁获取与volatile读有相同的内存语
义。这表明synchronized不仅提供了互斥访问的同步机制,还具备了volatile的内存可见性保障。
未完待续
很高兴与你相遇!如果你喜欢本文内容,记得关注哦!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
一把
两种
承诺
synchronized
如何
相关帖子
如何使用 vxe-gantt table 甘特图来实现多个维度视图展示
数据库如何处理大量的交易流水记录
如何实现 vxe-tree 树组件拖拽节点后进行二次确认提示
Oracle如何查询SEQUENCE的当前值而不增加SEQUENCE的值
Kafka如何保证「消息不丢失」,「顺序传输」,「不重复消费」
关于synchronized-reentrantlock-volatile学习总结1.0
工作后如何进行持续学习
如何使用 vxe-gantt table 甘特图来实现多个维度视图展示
昆明黄金店推荐:如何甄选“价值平权”的黄金消费专家?
2026年成都品牌主,如何选择AI优化搜索(AI GEO)合作伙伴,附压箱底选购技巧
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
代码
如何使用 vxe-gantt table 甘特图来实现多个维度视图展示
2
484
馏栩梓
2025-12-07
业界
数据库如何处理大量的交易流水记录
3
393
柄利
2025-12-08
代码
如何实现 vxe-tree 树组件拖拽节点后进行二次确认提示
0
162
啪炽
2025-12-10
安全
Oracle如何查询SEQUENCE的当前值而不增加SEQUENCE的值
0
935
魁睥
2025-12-10
业界
Kafka如何保证「消息不丢失」,「顺序传输」,「不重复消费」
1
42
步雪卉
2025-12-12
业界
关于synchronized-reentrantlock-volatile学习总结1.0
0
372
常士
2025-12-12
安全
工作后如何进行持续学习
1
636
祖娅曦
2025-12-12
代码
如何使用 vxe-gantt table 甘特图来实现多个维度视图展示
1
788
晚能
2025-12-13
安全
昆明黄金店推荐:如何甄选“价值平权”的黄金消费专家?
0
229
靳夏萱
2025-12-14
科技
2026年成都品牌主,如何选择AI优化搜索(AI GEO)合作伙伴,附压箱底选购技巧
0
950
百谖夷
2025-12-15
回复
(2)
孜尊
7 天前
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢分享,下载保存了,貌似很强大
毁抨句
6 天前
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
热心回复!
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
捐催制
6 天前
关注
0
粉丝关注
22
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994893
kk14977
6845357
3934307807
991123
4
xiangqian
638210
5
韶又彤
9998
6
宋子
9983
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
752
解决 iOS 上 Swiper 滑动图片闪烁问题:原
424
OpenCV (C++) 提速技巧(以Haar小波变换为
206
Claude Code 使用 Skills
670
资源总是不够用?这次,我用一套系统盘活了
976
UniEdit:首个大型开放域大模型知识编辑基
575
Karmada v1.16 版本发布!支持多模板工作负
311
《ESP32-S3使用指南—IDF版 V1.6》第五十五
941
纯前端调用大模型真的安全吗?我踩过的坑比
895
【分析式AI】-带你秒弄懂决策树与随机森林
98
DBLens 的数据安全、登录方式与离线使用说
71
国内开发者合规订阅 Claude Code 的 3 条最
154
Perforce QAC 2025.3 新版上线 | 速度与深
476
防止跨站脚本攻击(XSS)(完整版HTTP安全
353
Wayland下RDP服务器的搭建
888
Flink学习笔记:状态后端
535
csq-蓝桥杯python-基础语法2-列表与循环语
512
C#+VisionMaster 学习笔记(目录)-目录
586
ROS2核心概念之参数
88
【Agent】MemOS 源码笔记---(5)---记忆分类
129
.NET周刊【11月第4期 2025-11-23】