27 | 并发工具类模块热点问题答疑
王宝令
该思维导图由 AI 生成,仅供参考
前面我们用 13 篇文章的内容介绍了 Java SDK 提供的并发工具类,这些工具类都是久经考验的,所以学好用好它们对于解决并发问题非常重要。我们在介绍这些工具类的时候,重点介绍了这些工具类的产生背景、应用场景以及实现原理,目的就是让你在面对并发问题的时候,有思路,有办法。只有思路、办法有了,才谈得上开始动手解决问题。
当然了,只有思路和办法还不足以把问题解决,最终还是要动手实践的,我觉得在实践中有两方面的问题需要重点关注:细节问题与最佳实践。千里之堤毁于蚁穴,细节虽然不能保证成功,但是可以导致失败,所以我们一直都强调要关注细节。而最佳实践是前人的经验总结,可以帮助我们不要阴沟里翻船,所以没有十足的理由,一定要遵守。
为了让你学完即学即用,我在每篇文章的最后都给你留了道思考题。这 13 篇文章的 13 个思考题,基本上都是相关工具类在使用中需要特别注意的一些细节问题,工作中容易碰到且费神费力,所以咱们今天就来一一分析。
1. while(true) 总不让人省心
《14 | Lock&Condition(上):隐藏在并发包中的管程》的思考题,本意是通过破坏不可抢占条件来避免死锁问题,但是它的实现中有一个致命的问题,那就是: while(true) 没有 break 条件,从而导致了死循环。除此之外,这个实现虽然不存在死锁问题,但还是存在活锁问题的,解决活锁问题很简单,只需要随机等待一小段时间就可以了。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了Java SDK提供的并发工具类模块中的热点问题,并提供了解决方案。作者强调了在面对并发问题时,需要关注细节问题和最佳实践。文章列举了一些常见的并发问题,如while(true)死循环、signalAll()的使用、Semaphore需要锁中锁、锁的申请和释放要成对出现、回调函数执行线程、共享线程池的问题以及线程栈dump的利用。通过对这些问题的分析和解决方案的提供,读者可以加深对并发工具类模块的理解,提高在实际应用中解决并发问题的能力。文章内容丰富,涵盖了多个并发问题及其解决方案,对于Java开发人员来说具有很高的实用价值。文章以技术问题为主线,通过具体案例和解决方案,帮助读者深入理解并发工具类模块,提升解决实际并发问题的能力。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 并发编程实战》,新⼈⾸单¥59
《Java 并发编程实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(22)
- 最新
- 精选
- Sunqc听老师讲课是一种享受,很舒服,从文字叙述就感觉很和蔼可亲,不像有的老师,虽然技术也很牛,但是话里话外透漏着自己多牛多牛的感觉
作者回复: 感谢感谢😃
2019-04-30474 - DFighting关于线程协作那里为什么使用单线程线程池,特意回头重新看了下代码,终于明白了老师的做法,因为回调函数也会占据一个执行线程,如果不使用额外的线程,那么就会存在部分串行,就达不到完全分工并行,以提升吞吐的效果了
作者回复: 👍
2019-09-2728 - 邱王老师你好,我想问您一个问题:在实际的项目中使用线程池并行执行任务的时候,是不是和数据库的交互都不要放在线程池当中
作者回复: 这个还是要看实际场景,主要是考虑数据库事务,还有线程池是不是隔离的
2019-04-307 - 美美2. signalAll() 总让人省心 如果非常明确的知道 只有一个线程在阻塞等待,明确的唤醒一个线程,这样不更好吗?
作者回复: 有时候明明知道方法返回值不会为空,依然会判断一下,这个只是最佳实践而已
2020-02-2225 - kimoti想请教老师一个问题,为什么当一个线程遇到阻塞式IO的时候,其他线程都会阻塞呢? 其他线程并没有遇到阻塞式IO呀。
作者回复: 共享一个线程池,只要有一个阻塞方法,最终所有线程都会阻塞
2020-05-2054 - 郑晨Cc老师 第一个while(true)的例子 怎么在释放锁之前就 break退出循环了?难道break不该在释放锁之后吗?
作者回复: finally都会执行
2019-05-054 - ban老师,你好。 第五题的问题里面:通过源码你会发现 CyclicBarrier 是同步调用回调函数之后才唤醒等待的线程,如果我们在回调函数里直接调用 check() 方法,那就意味着在执行 check() 的时候,是不能同时执行 getPOrders() 和 getDOrders() 的。 意思是说如果回调函数直接执行chekc()方法,会让check()和(getPOrders() 和 getDOrders() )变成串行的情况吗!
作者回复: 执行 check() 的时候,是不能同时执行 getPOrders() 和 getDOrders(),因为执行这两个方法的线程一个在等待,一个正在忙着执行 check()。
2019-05-012 - 高志强老师,我想问一下您文章中的流程图,使用什么工具画的呢
作者回复: ppt
2022-08-11归属地:辽宁 - 码小呆看老师的课程,结合java并发编程实战结合,学习起来更加好呢~~
作者回复: 这个专栏可以叫<java并发编程注>,看这个专栏有助于看懂好多并发编程的书籍
2022-06-29 - 杨春鹏您好。我现在的业务需求: 只要有一个子线程失败,那么主线程以及其他子线程的事务也要进行回滚? 那怎么实现比较好一些。谢谢
作者回复: 很像两阶段提交的场景,你可以试一试
2019-07-112
收起评论