Java 并发编程实战
王宝令
资深架构师
71384 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
学习攻略 (1讲)
Java 并发编程实战
15
15
1.0x
00:00/00:00
登录|注册

27 | 并发工具类模块热点问题答疑

前面我们用 13 篇文章的内容介绍了 Java SDK 提供的并发工具类,这些工具类都是久经考验的,所以学好用好它们对于解决并发问题非常重要。我们在介绍这些工具类的时候,重点介绍了这些工具类的产生背景、应用场景以及实现原理,目的就是让你在面对并发问题的时候,有思路,有办法。只有思路、办法有了,才谈得上开始动手解决问题。
当然了,只有思路和办法还不足以把问题解决,最终还是要动手实践的,我觉得在实践中有两方面的问题需要重点关注:细节问题与最佳实践。千里之堤毁于蚁穴,细节虽然不能保证成功,但是可以导致失败,所以我们一直都强调要关注细节。而最佳实践是前人的经验总结,可以帮助我们不要阴沟里翻船,所以没有十足的理由,一定要遵守。
为了让你学完即学即用,我在每篇文章的最后都给你留了道思考题。这 13 篇文章的 13 个思考题,基本上都是相关工具类在使用中需要特别注意的一些细节问题,工作中容易碰到且费神费力,所以咱们今天就来一一分析。

1. while(true) 总不让人省心

《14 | Lock&Condition(上):隐藏在并发包中的管程》的思考题,本意是通过破坏不可抢占条件来避免死锁问题,但是它的实现中有一个致命的问题,那就是: while(true) 没有 break 条件,从而导致了死循环。除此之外,这个实现虽然不存在死锁问题,但还是存在活锁问题的,解决活锁问题很简单,只需要随机等待一小段时间就可以了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 并发编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(22)

  • 最新
  • 精选
  • Sunqc
    听老师讲课是一种享受,很舒服,从文字叙述就感觉很和蔼可亲,不像有的老师,虽然技术也很牛,但是话里话外透漏着自己多牛多牛的感觉

    作者回复: 感谢感谢😃

    4
    73
  • DFighting
    关于线程协作那里为什么使用单线程线程池,特意回头重新看了下代码,终于明白了老师的做法,因为回调函数也会占据一个执行线程,如果不使用额外的线程,那么就会存在部分串行,就达不到完全分工并行,以提升吞吐的效果了

    作者回复: 👍

    2
    8
  • 王老师你好,我想问您一个问题:在实际的项目中使用线程池并行执行任务的时候,是不是和数据库的交互都不要放在线程池当中

    作者回复: 这个还是要看实际场景,主要是考虑数据库事务,还有线程池是不是隔离的

    7
  • 美美
    2. signalAll() 总让人省心 如果非常明确的知道 只有一个线程在阻塞等待,明确的唤醒一个线程,这样不更好吗?

    作者回复: 有时候明明知道方法返回值不会为空,依然会判断一下,这个只是最佳实践而已

    2
    5
  • kimoti
    想请教老师一个问题,为什么当一个线程遇到阻塞式IO的时候,其他线程都会阻塞呢? 其他线程并没有遇到阻塞式IO呀。

    作者回复: 共享一个线程池,只要有一个阻塞方法,最终所有线程都会阻塞

    5
    4
  • 郑晨Cc
    老师 第一个while(true)的例子 怎么在释放锁之前就 break退出循环了?难道break不该在释放锁之后吗?

    作者回复: finally都会执行

    4
  • ban
    老师,你好。 第五题的问题里面:通过源码你会发现 CyclicBarrier 是同步调用回调函数之后才唤醒等待的线程,如果我们在回调函数里直接调用 check() 方法,那就意味着在执行 check() 的时候,是不能同时执行 getPOrders() 和 getDOrders() 的。 意思是说如果回调函数直接执行chekc()方法,会让check()和(getPOrders() 和 getDOrders() )变成串行的情况吗!

    作者回复: 执行 check() 的时候,是不能同时执行 getPOrders() 和 getDOrders(),因为执行这两个方法的线程一个在等待,一个正在忙着执行 check()。

    2
  • 高志强
    老师,我想问一下您文章中的流程图,使用什么工具画的呢

    作者回复: ppt

    归属地:辽宁
  • 码小呆
    看老师的课程,结合java并发编程实战结合,学习起来更加好呢~~

    作者回复: 这个专栏可以叫<java并发编程注>,看这个专栏有助于看懂好多并发编程的书籍

  • 杨春鹏
    您好。我现在的业务需求: 只要有一个子线程失败,那么主线程以及其他子线程的事务也要进行回滚? 那怎么实现比较好一些。谢谢

    作者回复: 很像两阶段提交的场景,你可以试一试

    2
收起评论
显示
设置
留言
22
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部