代码精进之路
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
38234 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
结束语 (1讲)
代码精进之路
15
15
1.0x
00:00/00:00
登录|注册

22丨高效率,从超越线程同步开始!

重新设计类,拆分成几个类
实现多线程安全的子类
只同步和共享资源变化相关的逻辑
减少同步线程的阻塞时间
只同步和共享资源变化相关的逻辑
设计不可变的类
使用Java的关键字“final”
没有改变共享资源的行为
不关心共享资源的变化
使用单线程
改变共享资源的行为
关心共享资源的变化
两个以上的线程
可变量和不变量的概念
鱼缸比喻
Signature类的多线程安全问题
减少同步线程的阻塞时间
减少线程同步时间
不可变的量
避免线程同步
同步需要排队,损害效率
需要同步的场景
线程的并发执行和共享进程资源
一起来动手
减少线程同步时间
避免线程同步
同步是损害效率的
什么时候需要同步?
高效率,从超越线程同步开始!

该思维导图由 AI 生成,仅供参考

线程的同步是学习一门编程语言的难点。刚开始线程同步的困难,主要在于了解技术;跨过了基本技术的门槛后,更难的是掌握最基本的概念。
学习技术时,我们对基本概念熟视无睹,只想将宝剑尽快握在手,哪管宝剑何时该挥出的教导。学会技术后,基本概念就会回来找我们算旧账,出错一次剑,就记一笔账。账本慢慢变厚的过程,也是我们向基本概念靠拢的过程。当我们掌握了最基本的概念后,开始慢慢还账,账本再越变越薄。
不单单是线程和同步,掌握好基本概念,几乎是我们学习所有技术背后的困境。这怨不得我们自己,我们认识一件事情的过程,大抵就是这样。
如果有人很早地就敲着桌子,不厌其烦地重复着基本的概念,事情会不会容易一些?这一次,我们聊聊线程同步的基本概念,以及如何超越线程同步。

什么时候需要同步?

线程有两个重要的特征,就是并发执行和共享进程资源。
你可以把进程想象成一个鱼缸。鱼缸里的金鱼可以看作线程。鱼缸里的碎石、水草、鱼食等可以看作共享的资源。每一条鱼都独立行动,随时可以吐个气泡,吃点鱼食,耍弄下水草。
鱼缸里的碎石、水草,小鱼儿搬不走、吃不掉,是一个不变的量。鱼食和气泡就不一样了,每一条小鱼儿随时都会吐泡泡、吃鱼食,改变气泡和鱼食的数量。鱼食和气泡,是鱼缸里的可变量。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文以生动的比喻和具体的代码示例,深入浅出地介绍了线程同步的基本概念和超越线程同步的方法。通过讨论线程同步的基本概念以及超越线程同步的技巧,强调了线程同步对效率的损害,并提出了不使用线程同步的最高技巧。文章还介绍了如何使用final关键字创建不可变类,以及在设计接口或实现代码时如何减少同步阻塞时间。此外,文章还提到了一个具体的Java核心类Signature,探讨了如何实现一个天然的多线程安全的子类,以及重新设计这个类的可能方案。总之,本文通过具体案例和技术讨论,为读者提供了深入了解线程同步及其超越方法的机会。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《代码精进之路》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • Sisyphus235
    先将启动 signature 的部分拆分出来生成一个类,完成 verification 和 signing 的初始化。更新的方法放在一个类中扩展 signature,这样所有修改的值都是一个对象的属性值,这样会不会多线程安全?

    作者回复: 有一个思路,就是把update()的逻辑内部化,比如使用Stream而不是byte[]。没有了update()方法,这个类重构起来就方便多了。

    2019-05-23
    3
  • 克里斯
    刚工作一年的程序员小嫩鱼,一直很想成为一种人:思维清晰,思路快。 团队也有一些思路严谨的同事,然而问他如何思考问题的,他也只是说多思考多想;问一些代码写的好的同事,他们也说不出所以然。所以决定开始了自己的求索之路。 带我入门的是极客时间 刘超《趣谈网络协议》,最大的收获就是感觉理解技术代表的“需求(或者说是what+why)”才是理解技术的核心所在。 一直感觉自己代码写的不好,看了一些技术书,基本上也是介绍一些知识性的细节,基本也是技术的语法和常见的注意事项。实践了一段时间,感觉自己没有什么提升,无论是阅读代码还是写代码。 就开始找代码重构之类的书,很庆幸自己读了《head first 设计模式》。这本书基本上是我觉得写的最浅显也是最深刻的书籍了,我认为是扫地僧级别的。但是很多觉得知识才是王道的人,发现不了这本书的能量之大。也是在这本书我了解到了思考需求应该如何落地,以及应该考虑哪些未知变化,也就是(how+if)。 后来追本溯源,发现了逻辑学教材《金字塔原理》,系统的了解了思维的结构,但是实践却需要我一辈子去努力。 读到范前辈的文章时,我更加确定了一个优秀的学者是什么思维,感谢你们的课程,让我更加确信这是一条无论怎么努力都不为过的道路。
    2019-05-04
    15
  • 唐名之
    学习总结: 1:多线程具备并行和共享资源特性,多核cpu并行可加快执行速度但需谨慎共享资源带来的隐患; 2:多线程中使用单例对象,工具类都需注意多线程安全问题; 3:优化同步,加锁粒度尽量控制更细,尽量减少阻塞时间;
    2019-02-22
    10
  • ifelse
    我们要养成一个习惯,看到声明的变量,就要琢磨,这个变量能不能声明成不可变的量?--记下来
    2022-07-24
  • aoe
    🐟吐泡泡的例子非常生动形象,可以当故事给小朋友讲
    2021-12-17
  • kelvin
    这个线程安全怎么定义呢?是要一个线程改变内容不影响另外一个线程的数据,还是只是不能同步修改数据。如果是第一种可以把数据拆分成一个类,每次把数据传递进入。第二种只要在临界代码加锁就可以。
    2019-06-15
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部