Java并发编程实战
王宝令
资深架构师
立即订阅
15152 人已学习
课程目录
已完结 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并发编程实战
登录|注册

33 | Thread-Per-Message模式:最简单实用的分工方法

王宝令 2019-05-14
我们曾经把并发编程领域的问题总结为三个核心问题:分工、同步和互斥。其中,同步和互斥相关问题更多地源自微观,而分工问题则是源自宏观。我们解决问题,往往都是从宏观入手,在编程领域,软件的设计过程也是先从概要设计开始,而后才进行详细设计。同样,解决并发编程问题,首要问题也是解决宏观的分工问题
并发编程领域里,解决分工问题也有一系列的设计模式,比较常用的主要有 Thread-Per-Message 模式、Worker Thread 模式、生产者 - 消费者模式等等。今天我们重点介绍 Thread-Per-Message 模式。

如何理解 Thread-Per-Message 模式

现实世界里,很多事情我们都需要委托他人办理,一方面受限于我们的能力,总有很多搞不定的事,比如教育小朋友,搞不定怎么办呢?只能委托学校老师了;另一方面受限于我们的时间,比如忙着写 Bug,哪有时间买别墅呢?只能委托房产中介了。委托他人代办有一个非常大的好处,那就是可以专心做自己的事了。
在编程领域也有很多类似的需求,比如写一个 HTTP Server,很显然只能在主线程中接收请求,而不能处理 HTTP 请求,因为如果在主线程中处理 HTTP 请求的话,那同一时间只能处理一个请求,太慢了!怎么办呢?可以利用代办的思路,创建一个子线程,委托子线程去处理 HTTP 请求。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java并发编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(26)

  • 唯美
    快速解决,就只能改jvm内存配置,增大jvm新生代的大小,长期解决,引入NIO或AIO,netty 就是这么干的

    作者回复: 👍

    2019-05-14
    29
  • QQ怪
    之前一直听别人说go语言很容易抗并发,原来是有个这么牛逼的轻量级线程在啊,并且理解了基本原理,感谢老师分享,为自己扩充了眼界了,为老师打call👍

    作者回复: 客气了😂😂

    2019-05-14
    13
  • echo_陈
    go语言的协程是语言级别的支持……java写个库就能支持轻量级线程了,很好奇库级别是如何支持的,原理是什么
    2019-05-14
    9
  • ~Wade
    有一个java库叫Quasar Fiber ,通过javaagent技术可以实现轻量级线程
    官网:http://www.paralleluniverse.co/quasar/
    2019-06-21
    8
  • 每次创建一个线程高并发肯定OOM,1引入线程池控制创建线程的大小,通过压测得到比较合理的线程数量配置,2 需要在请求端增加一个限流模块,自我保护

    作者回复: 👍

    2019-05-24
    5
  • 右耳听海
    不清楚老师讲这个模式的意义在什么地方,既然目前普遍的方案是使用基于nio的netty,并没发现这个模式在具体应用场景中的普遍应用,除了你说的调度场景,在高并发的情况下也没使用fiber,使用的是netty,为何不讲讲netty的思路
    2019-05-18
    1
    4
  • Sam
    老师,请问Java不支持轻量级线程,但是有Fibe,那是不是就可以用Fibe在实际项目中,然后相当于Java也支持轻量级线程了?

    作者回复: 实际项目还是不建议用,等官方正式发布吧

    2019-08-01
    2
  • cricket1981
    网上查资料说java中的线程是内核空间的,轻量级线程属于用户空间的,是这样吗?另外轻量级线程是如何调度的?

    作者回复: 是的,如何调度我就说不清楚了

    2019-05-17
    2
  • JackJin
    这节课涨知识的
    2019-05-15
    2
  • 245864982
    老师,那tomcat也是一个请求一个线程的吧?它是怎么解决的。是用线程池吗?

    作者回复: 是的

    2019-11-28
    1
  • Sharry
    Kotlin 支持协程, 并且实现了完善的调度策略, 可以考虑使用 Kotlin 作为替代方案

    作者回复: 👍就因为这个原因对kotlin好感倍增

    2019-09-30
    1
  • 张三
    打卡
    2019-05-14
    1
  • 赤城
    go中的轻量级线程就是协程吧?

    作者回复: 是的

    2019-11-06
  • 陌臣
    打卡,越到后面人越少了
    2019-10-18
    2
  • ly
    老师,能不能提供一个编译openjdk的方法,我在网上搜索了好多博客,按照他们说的步骤,都出现各种各样的问题,难道编译openjdk这么难?主要是长期用window系统,搞起好麻烦!

    作者回复: 那就搞linux吧,在linux上太简单了,按照官方文档来就没问题

    2019-10-09
  • DFighting
    快速解决就是碓资源,调整jvm新生代的大小,具体解决可以从两个方面考虑:
    1、把线程的创建模块独立出来,比如可以用类似队列的方式存储要执行的任务,并由具体执行程序进行线程调度和执行。
    2、具体执行模块可以进一步细化,比如将网络/磁盘IO等操作和程序执行操作独立开来,以提升并行化的程度等。
    总的来看就是把各种通用的操作按照相关性的大小和能否并行化把串行改为并行,当然就Java本身来说,线程还是一个重量级的资源,真正编写感觉还是需要池化的思想,不然代价太大,感觉性能上怕是不能太好
    2019-09-29
  • 疯狂咸鱼
    老师,轻量级线程语言层次实现的,该怎么理解

    作者回复: 相对于用类库方式实现而言的

    2019-07-21
  • 疯狂咸鱼
    宝令老师的买别墅比喻简直了
    2019-07-21
  • Jxin
    18年底kt发布的最新版本就提到支持协程。我在想是不是就拿老师这里提的这个openjdk的开源项目实现的?毕竟kt无脑衔接java社区的依赖库。
    2019-06-16
  • tdytaylor
    老师的问题其实就在于并发量太大,创建大量的线程导致内存不够用,最直接的方式就是减少线程的创建:看到老师写的这个demo用的nio类库,直接改成多路复用,减少线程的创建。我另外一个想法是采用消费者和生产者模式,主线程负责处理连接请求,拿到连接之后放到消费队列里面,让线程池的线程去消费。
    2019-05-27
收起评论
26
返回
顶部