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

44 | 协程:更轻量级的线程

王宝令 2019-06-08
Java 语言里解决并发问题靠的是多线程,但线程是个重量级的对象,不能频繁创建、销毁,而且线程切换的成本也很高,为了解决这些问题,Java SDK 提供了线程池。然而用好线程池并不容易,Java 围绕线程池提供了很多工具类,这些工具类学起来也不容易。那有没有更好的解决方案呢?Java 语言里目前还没有,但是其他语言里有,这个方案就是协程(Coroutine)。
我们可以把协程简单地理解为一种轻量级的线程。从操作系统的角度来看,线程是在内核态中调度的,而协程是在用户态调度的,所以相对于线程来说,协程切换的成本更低。协程虽然也有自己的栈,但是相比线程栈要小得多,典型的线程栈大小差不多有 1M,而协程栈的大小往往只有几 K 或者几十 K。所以,无论是从时间维度还是空间维度来看,协程都比线程轻量得多。
支持协程的语言还是挺多的,例如 Golang、Python、Lua、Kotlin 等都支持协程。下面我们就以 Golang 为代表,看看协程是如何在 Golang 中使用的。

Golang 中的协程

在 Golang 中创建协程非常简单,在下面的示例代码中,要让 hello() 方法在一个新的协程中执行,只需要go hello("World") 这一行代码就搞定了。你可以对比着想想在 Java 里是如何“辛勤”地创建线程和线程池的吧,我的感觉一直都是:每次写完 Golang 的代码,就再也不想写 Java 代码了。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java并发编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(22)

  • 高源
    王老师请教一下现在多数互联网公司后台都采用go语言开发了,学习go语言是不是也很有必要了,还是根据应用场景或者工作的实际情况来看啊。

    作者回复: 看你时间了,最好要实践,如果公司没这样的项目,建议参与一个质量不错的开源的项目,一定要实践

    2019-06-08
    1
    3
  • the geek
    哈哈,本来是上来复习一下,结果新冒出了一章46/45

    作者回复: 早知道这么想,我就收工了😂😂

    2019-06-08
    3
  • 海水
    王老师好,有个问题请教下,公司支付接口调用的三方接口,这个三方接口秒级的耗时,如果想提高并发单单提高tomcat线程数或者该用异步sevlet是不是解决不了问题?我感觉这种情况应该是不是应该用协程比如go routine这样的才能解决这样的并发场景?毕竟三方接口的耗时省不了

    作者回复: 你可以试试基于netty的http客户端,再加上异步servlet试试。这俩必须一起用才有效果

    2019-06-08
    1
    1
  • 搏未来
    能写出易于理解的代码也是一种能力😁
    2019-06-08
    1
  • JK-舒玉强
    很喜欢王老师的课程,怎么才能够变得跟老师一样厉害呢?

    作者回复: 我只是把它们总结出来而已,并不厉害😂

    2019-11-26
  • Geek_09c245
    java也有实现协程的框架了吧
    2019-10-21
  • DFighting
    很赞同老师最后提到的软件产品开发,任何需要协作和迭代的事物都需要遵从基本的规范和规则,不然再牛叉的技术只能孤芳自赏,给产品带来的只有灾难。

    作者回复: 👍

    2019-10-17
  • timmy21
    老师,同步非阻塞不太理解,既然同步了,那就是线程干不了其他事情了,那么是阻塞还是非阻塞,又有什么区别呢?盼老师解惑。
    2019-10-11
    1
  • null
    re: 典型的线程栈大小差不多有 1M,而协程栈的大小往往只有几 K 或者几十 K。

    不明觉厉,假设协程只占 2K,使用线程能支持 2,000 并发,那协程就是 1,024,000,我的天!!
    协程内部是怎么实现的,居然只占几 K。
    2019-09-16
  • 业余草
    关于协程,整理了一些我个人的理解,https://mp.weixin.qq.com/s/yN9z1bupZLjuK2crJKpIpg,请帮忙指正!

    作者回复: 👍

    2019-07-28
  • Boomkeeper
    老师,请教一个问题:关于协程来优化io的场景,具体这个咋玩?

    作者回复: 这个问题太大了😂

    2019-07-11
  • 花儿少年
    我公司的营销架构代码就异常难懂,神马注释都没有,不管是看还是排查问题都难度贼大
    2019-06-19
  • Jxin
    我也把代码可读性排在第一位。我的目的是降低他人加入开发的成本。从长远看,这会让软件更具活力和可能性。毕竟虽然暂时来看为了可读性可能会损失一些性能和时间。但从长远来看,加入的人越多,节省别人的时间就越多,总会超过我的投入。而性能,随着业务的发展,后续可能能写出更贴合业务场景的优化方案。更何况,习惯后,写高可读性的代码并不会多花我时间。

    作者回复: 👍

    2019-06-17
  • 苏志辉
    cosocket为什么可以非阻塞,也需要等待有数据可读才行吧,没太理解

    作者回复: 全面理解得熟悉协程的原理还有操作系统的api

    2019-06-11
    1
  • Sunqc
    同步和阻塞,异步和非阻塞,感觉好相似。同步不就是阻塞吗

    作者回复: 阻塞本质上是cpu是否把线程挂起,所以阻塞都是和操作系统api有关的

    2019-06-10
    1
  • windy
    关注老师专栏有一段时间了,老师讲解通俗易懂,涉猎的知识面很广。讲解某个知识点首先说明由来,背后理论,然后展开脉络进行剖析,如何应用到实践中,学以致用。在此送上感谢!

    作者回复: 客气了,你觉得还有用,我心里就踏实了,我就怕讲不明白

    2019-06-10
  • Liam
    cosocket的非阻塞体现在哪里呢,是说receive等方法是非阻塞方法吗?

    作者回复: 是的

    2019-06-09
  • zhangtnty
    王老师好,很赞同总结中讲的代码质量的看法。我认为好的项目不仅功能强大, 代码结构清晰非常重要, 好的代码结构一定和业务如出一辙,而不是过多的花式代码,总给人一种练手的感觉。

    作者回复: 代码结构和业务匹配太重要了👍

    2019-06-08
  • cricket1981
    Actor model中创建actor的代价也很小,可不可以认为actor model也属于协程?

    作者回复: 我觉得可以这么认为

    2019-06-08
  • QQ怪
    哔,打卡
    2019-06-08
收起评论
22
返回
顶部