登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
签到
每天签到奖励2-10圆
导读
排行榜
TG频道
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
VIP申请
VIP网盘
网盘
联系我们
发帖说明
每日签到
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
一把锁的两种承诺:synchronized如何同时保证互斥与内存 ...
一把锁的两种承诺:synchronized如何同时保证互斥与内存可见性?
[ 复制链接 ]
捐催制
2025-9-24 11:05:59
在多线程环境中,临界区(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
如何
相关帖子
如何成为一位人心所向的管理者?我的经历告诉你,做好计划管理
如何设计一条稳定的应用交付流程?|云效工程师指北
手把手教你如何高效落地多项目管理 | 一看既会
Kafka如何快速的入个门呢?
如何使用 INFINI Gateway 对比 ES 索引数据
vue3使用h函数如何封装组件和$attrs和props的区别
【OpenGL ES】不用GLSurfaceView,如何渲染图像
如何使用io_uring构建快速响应的I/O密集型应用?
浅谈如何更好的进行需求评审
【经验贴】多项目并行,如何解决资源管理这个难点?
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
如何成为一位人心所向的管理者?我的经历告诉你,做好计划管理
0
337
舒娅友
2025-10-07
安全
如何设计一条稳定的应用交付流程?|云效工程师指北
0
54
存叭
2025-10-07
安全
手把手教你如何高效落地多项目管理 | 一看既会
1
18
蝙俚
2025-10-07
安全
Kafka如何快速的入个门呢?
0
567
炳裘垦
2025-10-07
安全
如何使用 INFINI Gateway 对比 ES 索引数据
1
98
稞冀
2025-10-08
业界
vue3使用h函数如何封装组件和$attrs和props的区别
0
348
猷咎
2025-10-09
业界
【OpenGL ES】不用GLSurfaceView,如何渲染图像
0
117
坡琨
2025-10-09
安全
如何使用io_uring构建快速响应的I/O密集型应用?
0
286
井晶灵
2025-10-09
安全
浅谈如何更好的进行需求评审
1
275
边书仪
2025-10-10
安全
【经验贴】多项目并行,如何解决资源管理这个难点?
0
716
拼匍弦
2025-10-10
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
程序
安全
签约作者
程序园优秀签约作者
发帖
捐催制
2025-9-24 11:05:59
关注
0
粉丝关注
22
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9999501
dage888
999994
富账慕
10007
4
匝抽
9986
5
孙淼淼
9992
6
柴古香
9993
7
筒濂
9982
8
凌彦慧
9991
9
崔瑜然
9984
10
慢秤
9979
查看更多