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

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

线上问题定位
阻塞式I/O问题
线程ThreadLocal数据
线程池大小
try{}finally{}最佳实践
对象池中的线程安全问题
稳妥的设计
解决方法
活锁问题
实践与编码习惯
熟练使用并发工具类
线程栈dump
共享线程池
回调函数执行线程
锁的申请和释放要成对出现
Semaphore需要锁中锁
signalAll()问题
while(true)问题
细节问题与最佳实践
思路和办法
实现原理
应用场景
产生背景
总结
问题分析
学习重点
Java SDK提供的并发工具类
并发工具类模块热点问题答疑

该思维导图由 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
立即购买
登录 后留言

全部留言(22)

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

    作者回复: 感谢感谢😃

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

    作者回复: 👍

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

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

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

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

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

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

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

    作者回复: finally都会执行

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

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

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

    作者回复: ppt

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

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

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

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

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