Java并发编程实战
王宝令
资深架构师
立即订阅
15164 人已学习
课程目录
已完结 50 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要学习并发编程?
免费
学习攻略 (1讲)
学习攻略 | 如何才能学好并发编程?
第一部分:并发理论基础 (13讲)
01 | 可见性、原子性和有序性问题:并发编程Bug的源头
02 | Java内存模型:看Java如何解决可见性和有序性问题
03 | 互斥锁(上):解决原子性问题
04 | 互斥锁(下):如何用一把锁保护多个资源?
05 | 一不小心就死锁了,怎么办?
06 | 用“等待-通知”机制优化循环等待
07 | 安全性、活跃性以及性能问题
08 | 管程:并发编程的万能钥匙
09 | Java线程(上):Java线程的生命周期
10 | Java线程(中):创建多少线程才是合适的?
11 | Java线程(下):为什么局部变量是线程安全的?
12 | 如何用面向对象思想写好并发程序?
13 | 理论基础模块热点问题答疑
第二部分:并发工具类 (14讲)
14 | Lock和Condition(上):隐藏在并发包中的管程
15 | Lock和Condition(下):Dubbo如何用管程实现异步转同步?
16 | Semaphore:如何快速实现一个限流器?
17 | ReadWriteLock:如何快速实现一个完备的缓存?
18 | StampedLock:有没有比读写锁更快的锁?
19 | CountDownLatch和CyclicBarrier:如何让多线程步调一致?
20 | 并发容器:都有哪些“坑”需要我们填?
21 | 原子类:无锁工具类的典范
22 | Executor与线程池:如何创建正确的线程池?
23 | Future:如何用多线程实现最优的“烧水泡茶”程序?
24 | CompletableFuture:异步编程没那么难
25 | CompletionService:如何批量执行异步任务?
26 | Fork/Join:单机版的MapReduce
27 | 并发工具类模块热点问题答疑
第三部分:并发设计模式 (10讲)
28 | Immutability模式:如何利用不变性解决并发问题?
29 | Copy-on-Write模式:不是延时策略的COW
30 | 线程本地存储模式:没有共享,就没有伤害
31 | Guarded Suspension模式:等待唤醒机制的规范实现
32 | Balking模式:再谈线程安全的单例模式
33 | Thread-Per-Message模式:最简单实用的分工方法
34 | Worker Thread模式:如何避免重复创建线程?
35 | 两阶段终止模式:如何优雅地终止线程?
36 | 生产者-消费者模式:用流水线思想提高效率
37 | 设计模式模块热点问题答疑
第四部分:案例分析 (4讲)
38 | 案例分析(一):高性能限流器Guava RateLimiter
39 | 案例分析(二):高性能网络应用框架Netty
40 | 案例分析(三):高性能队列Disruptor
41 | 案例分析(四):高性能数据库连接池HiKariCP
第五部分:其他并发模型 (4讲)
42 | Actor模型:面向对象原生的并发模型
43 | 软件事务内存:借鉴数据库的并发经验
44 | 协程:更轻量级的线程
45 | CSP模型:Golang的主力队员
结束语 (1讲)
结束语 | 十年之后,初心依旧
用户故事 (2讲)
用户来信 | 真好,面试考到这些并发编程,我都答对了!
3 个用户来信 | 打开一个新的并发世界
Java并发编程实战
登录|注册

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

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

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

《14 | Lock&Condition(上):隐藏在并发包中的管程》的思考题,本意是通过破坏不可抢占条件来避免死锁问题,但是它的实现中有一个致命的问题,那就是: while(true) 没有 break 条件,从而导致了死循环。除此之外,这个实现虽然不存在死锁问题,但还是存在活锁问题的,解决活锁问题很简单,只需要随机等待一小段时间就可以了。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java并发编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(13)

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

    作者回复: 感谢感谢😃

    2019-04-30
    26
  • 遇见阳光
    老师,我有一个疑问,如果说每个不同的业务都需要不同的线程池去处理,那这样线程池不是越来越多,这种应该如何解决
    2019-04-30
    5
  • 王老师你好,我想问您一个问题:在实际的项目中使用线程池并行执行任务的时候,是不是和数据库的交互都不要放在线程池当中

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

    2019-04-30
    2
  • 张三
    打卡,虽然没有深入了解每个工具类,但确实了解更多了。
    2019-04-30
    2
  • 墨飞域
    这一章的内容,我觉得等把整个专栏学完之后,还有必要再仔细回顾一遍,然后再加上其他的文章,自己动手写一下demo,才能记住的多一些,毕竟平时工作中用到多线程的地方不多
    2019-10-25
    1
  • DFighting
    关于线程协作那里为什么使用单线程线程池,特意回头重新看了下代码,终于明白了老师的做法,因为回调函数也会占据一个执行线程,如果不使用额外的线程,那么就会存在部分串行,就达不到完全分工并行,以提升吞吐的效果了

    作者回复: 👍

    2019-09-27
    1
  • 秋天
    并发编程还需要多踩坑,最近就因为这个导致系统出现异常,而导致线系统cpu占满
    2019-07-25
  • 杨春鹏
    您好。我现在的业务需求:
    只要有一个子线程失败,那么主线程以及其他子线程的事务也要进行回滚?
    那怎么实现比较好一些。谢谢

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

    2019-07-11
    1
  • 星辰
    天呐,我一直以为执行check()的是 fixedPool中的的那唯一一个线程!
    2019-05-12
    1
  • 郑晨Cc
    老师 第一个while(true)的例子 怎么在释放锁之前就 break退出循环了?难道break不该在释放锁之后吗?

    作者回复: finally都会执行

    2019-05-05
  • 捞鱼的搬砖奇
    老师能不能在上面提到的原文出错的代码边写上正确的做,并用注释说明
    2019-05-01
  • ban
    老师,你好。
    第五题的问题里面:通过源码你会发现 CyclicBarrier 是同步调用回调函数之后才唤醒等待的线程,如果我们在回调函数里直接调用 check() 方法,那就意味着在执行 check() 的时候,是不能同时执行 getPOrders() 和 getDOrders() 的。

    意思是说如果回调函数直接执行chekc()方法,会让check()和(getPOrders() 和 getDOrders() )变成串行的情况吗!

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

    2019-05-01
  • 苏志辉
    第五个问题,我觉得应该先同步取完前两个节点再异步调用check逻辑,否则极端情况,取到的两个节点不是匹配的

    作者回复: 如果check就一个线程执行,应该不会

    2019-04-30
收起评论
13
返回
顶部