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

39 | 案例分析(二):高性能网络应用框架Netty

王宝令 2019-05-28
Netty 是一个高性能网络应用框架,应用非常普遍,目前在 Java 领域里,Netty 基本上成为网络程序的标配了。Netty 框架功能丰富,也非常复杂,今天我们主要分析 Netty 框架中的线程模型,而线程模型直接影响着网络程序的性能
在介绍 Netty 的线程模型之前,我们首先需要把问题搞清楚,了解网络编程性能的瓶颈在哪里,然后再看 Netty 的线程模型是如何解决这个问题的。

网络编程性能的瓶颈

《33 | Thread-Per-Message 模式:最简单实用的分工方法》中,我们写过一个简单的网络程序 echo,采用的是阻塞式 I/O(BIO)。BIO 模型里,所有 read() 操作和 write() 操作都会阻塞当前线程的,如果客户端已经和服务端建立了一个连接,而迟迟不发送数据,那么服务端的 read() 操作会一直阻塞,所以使用 BIO 模型,一般都会为每个 socket 分配一个独立的线程,这样就不会因为线程阻塞在一个 socket 上而影响对其他 socket 的读写。BIO 的线程模型如下图所示,每一个 socket 都对应一个独立的线程;为了避免频繁创建、消耗线程,可以采用线程池,但是 socket 和线程之间的对应关系并不会变化。
BIO 的线程模型
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java并发编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(21)

  • 王维
    分享一下我之前学Netty的学习笔记,主要是源码分析:https://wangwei.one/tags/Netty/
    2019-05-29
    16
  • 那只羊
    QQ怪:Netty可以先从《Netty实战》开始,虽然翻译得一般,但是对于它的整体及各个组件你都能了解到;再就是调试源码来了解它了;最后应用到项目中去啦,比如实现一个简单的RPC,一个IM之类的

    作者回复: 👍感谢回复!

    2019-05-28
    13
  • QQ怪
    老师,学习netty除了学习老师的专栏还有什么从入门到专精的学习路线吗?

    作者回复: 热心同学回复了,我再加一点就是把网络编程的基础搞好

    2019-05-28
    8
  • 周治慧
    没太明白netty的线程模型,老师说一个socket对应一个Java线程,一个Java线程对应一个eventGroup,那图中不应该是一个socket对应一个eventgroup吗
    2019-05-28
    2
    3
  • 墙角儿的花
    这是我读过的最好的netty基本原理介绍

    作者回复: 😄

    2019-09-09
    2
  • 张德
    谢谢老师讲这个reactor模式 我最近要优化的系统主体就是采用这个模式 今天看了一天都云里雾里的 看到这篇文章瞬间有了一种有章可循的感觉

    作者回复: 对你有帮助就好😄

    2019-05-29
    2
  • 潭州太守
    老师,Reactor可以理解是Actor模式的一种吗

    作者回复: 我没这么想过😂思路上好像也有相通的地方,不过感觉还不是

    2019-06-04
    1
  • Sunqc
    我想知道老师后续有发布新的课程吗,喜欢你的课程

    作者回复: 感谢信任😄写不动了😂😂😂

    2019-05-28
    1
    1
  • sswrock
    看了 Doug Lee的 “Scalable IO in Java”,对于做个Swing GUI开发的人豁然开朗,
    感谢宝哥 和 DougLee
    2019-12-01
  • 反过来说的话就是一个线程有多个EventLoop 一个EventLoop有多个网络连接 对吧

    作者回复: EventLoop 和 Java 线程是 1 对 1 关系

    2019-09-24
  • 墙角儿的花
    问下老师,im服务端除了用netty,是不是用go的协程也好,连接和协程1对1服务,感觉这个场景下go协程并发能力绝对在netty之上啊

    作者回复: 协程最终也是依靠线程执行,所以理论上没有这种结论

    2019-09-09
  • 豪哥笑了
    后台采用Mina,单机16核,用c++测并发数目只有20个,可能什么问题
    2019-08-21
  • 宝石山
    在netty4中, 业务线程执行以下代码, name字段不是volatile, 根据happens-before原则, 在序列化层可能看不到name值. 我这理解有问题吗? 请老师指正

    User user = new User(); //business thread
    user.setName("admin");
    channel.write(user);
    ...
    encoder.encode(user); //io thread
    ...
    2019-07-25
  • 楊_宵夜
    老师好,bossGroup多于一条线程,纯属浪费这一点。能否扩展地说说呢?我稍微思考了一下,是否与TCP协议紧相关呢?例如滑动窗口机制那些?
    之前有说过一个限流器的案例,里面接受连接也是阻塞式API,如果bossGroup只有一条线程,而同一时刻又有10个人进行连接的话,那第十个人不就要等个一段时间(即使人类感官上基本无感知)?
    2019-07-23
  • 老师提到事件处理器是不能有阻塞操作的,实在需要就通过线程池异步处理,感觉这里的线程池避免不了,因为很难保证业务没有阻塞操作
    2019-06-21
  • 问下老师零拷贝是怎么实现的呢?

    作者回复: java nio有API

    2019-05-30
  • ban
    文章说的echo那篇文章应该是
    34 | Worker Thread模式:如何避免重复创建线程?
    才对。
    2019-05-28
  • 张三
    打卡!了解皮毛是不够的。
    2019-05-28
  • 晓杰
    之前做的充电桩也是用的netty,但是只能单机部署,因为netty用的是长连接,但是在分布式框架中网络连接是随机的,请问老师这种情况怎么解决

    作者回复: 没太明白你的痛点,你可以在客户端做负载均衡

    2019-05-28
  • 苏志辉
    netty中eventloop是延迟创建的
    2019-05-28
收起评论
21
返回
顶部