
56. synchronized:什么是自旋?
发布日期:2021-05-12 23:59:25
浏览次数:19
分类:精选文章
本文共 489 字,大约阅读时间需要 1 分钟。
在进行Java多线程编程时,特别是处理synchronized锁的代码块,优化等待线程的方式至关重要。对于那些仅执行极短时间内的代码的synchronized块,简单地让等待的线程直接阻塞可能并不是最佳选择。这是因为每次等待时都会强制将线程切换至内核态(kernel mode),这样会引起不少问题。用户态(user mode)和内核态的切换确实需要一定的上下文切换开销,而这种开销在锁保护力的度比较松的情况下,可能显得有些过分。
为了更好地解决这一问题,可以采取自旋(spin)技术。在获得锁之前,让等待的线程在用户态进行忙循环。这样可以减少内核态切换的开销。通常,我们会设置一个自旋次数限制,避免过度自旋导致的性能问题。如果是多次自旋都无法获得锁,那么再次进入阻塞状态是更优的选择。这种混合方式既节省了内核态切换带来的开销,又能提高吞吐量。
这种优化方法尤其适用于那些对锁保护需求并不严格时期,锁的使用不会因长时间等待而导致资源浪费的情况。需要注意的是,自旋次数设置需要根据具体情况进行权衡。适当让线程在用户态进行自旋,可以有效减少等待队列上的线程数目带来的内核态切换开销。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月22日 01时47分31秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Flask--简介
2019-03-11
16 python基础-恺撒密码
2019-03-11
Frame--Api框架
2019-03-11
Boostrap技能点整理之【网格系统】
2019-03-11
新闻发布项目——业务逻辑层(UserService)
2019-03-11
hibernate正向生成数据库表以及配置——hibernate.cfg.xml
2019-03-11
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
2019-03-11
java实现人脸识别源码【含测试效果图】——Dao层(IUserDao)
2019-03-11
使用ueditor实现多图片上传案例——前台数据层(Index.jsp)
2019-03-11
ssm(Spring+Spring mvc+mybatis)——saveDept.jsp
2019-03-11
解决Chrome播放视频闪屏黑屏无法播放
2019-03-11
Git简单理解与使用
2019-03-11
echarts 基本图表开发小结
2019-03-11
二分查找.基于有序数组的查找方法.704
2019-03-11
制作JS验证码(简易)
2019-03-11
adb通过USB或wifi连接手机
2019-03-11