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并发编程实战
登录|注册

13 | 理论基础模块热点问题答疑

王宝令 2019-03-28
到这里,专栏的第一模块——并发编程的理论基础,我们已经讲解完了,总共 12 篇,不算少,但“跳出来,看全景”你会发现这 12 篇的内容基本上是一个“串行的故事”。所以,在学习过程中,建议你从一个个单一的知识和技术中“跳出来”,看全局,搭建自己的并发编程知识体系。
为了便于你更好地学习和理解,下面我会先将这些知识点再简单地为你“串”一下,咱们一起复习下;然后就每篇文章的课后思考题、留言区的热门评论,我也集中总结和回复一下。
那这个“串行的故事”是怎样的呢?
起源是一个硬件的核心矛盾:CPU 与内存、I/O 的速度差异,系统软件(操作系统、编译器)在解决这个核心矛盾的同时,引入了可见性、原子性和有序性问题,这三个问题就是很多并发程序的 Bug 之源。这,就是01的内容。
那如何解决这三个问题呢?Java 语言自然有招儿,它提供了 Java 内存模型和互斥锁方案。所以,在02我们介绍了 Java 内存模型,以应对可见性和有序性问题;那另一个原子性问题该如何解决?多方考量用好互斥锁才是关键,这就是0304的内容。
虽说互斥锁是解决并发问题的核心工具,但它也可能会带来死锁问题,所以05就介绍了死锁的产生原因以及解决方案;同时还引出一个线程间协作的问题,这也就引出了06这篇文章的内容,介绍线程间的协作机制:等待 - 通知。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java并发编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(44)

  • binary
    这个专栏内容值得反复阅读!
    2019-03-28
    62
  • Jialin
    建议iamNigel同学去搜索下Integer String Boolean相关的知识,Integer会缓存-128~127这个范围内的数值,String对象同样会缓存字符串常量到字符串常量池,可供重复使用,所以不能用来用作锁对象,网上有相关的知识讲解和面试问题
    老师讲解的非常不错,单看每一节,觉得自己已略一二,学完这节才发现要自己的知识点要串起来,整体了解并发

    作者回复: 感谢帮忙回复!

    2019-03-28
    1
    26
  • linqw
    学完这模块,自己理下,老师帮忙看下哦
    1、产生并发的原因:cpu、内存、磁盘速度的差异,在硬件和软件方面解决速度差异引发的并发问题,cpu缓存->可见性,线程切换->原子性,编译优化->重排序,引发并发问题的根源。
    2、并发的解决:可见性解决方法->volatile、synchronized,原子性的解决方法->互斥锁,重排序->volatile,禁掉编译优化
    3、解决并发原子性产生的问题:死锁,死锁产生的所有条件->①资源互斥②不能抢占③占有且等待④循环等待,死锁的解决办法->①按锁的顺序获取②增加锁的分配器。
    4、宏观角度分析,以上都是从微观角度进行分析并发问题,宏观,即安全问题,性能问题,活跃性问题
    5、本质看问题,管程
    6、实际看问题,java生命周期,线程数的分配,线程的执行
    7、以子之矛攻子之盾,面向对象解决并发问题, 属性final、私有、只有getter方法没有setter方法,属性的赋值,深复制再进行操作等等

    作者回复: 很全面了

    2019-03-30
    15
  • Demon.Lee
    这个课程99便宜了,建议涨价,一定要反复多看几遍

    作者回复: 这个建议可以多提😃

    2019-03-28
    14
  • 小辉辉
    学了专栏之后,在项目里面写并发的BUG更有信心了
    2019-05-17
    9
  • 皮卡皮卡丘
    看下源码就知道了,Integer里有个内部类,会缓存一定范围的整数

    作者回复: 感谢帮忙回复!

    2019-03-28
    6
  • IamNigel
    Integer string Boolean的可重用没太明白,希望老师讲解下
    2019-03-28
    6
  • 红衣闪闪亮晶晶
    老师,我有一点不明白,我看到其他大佬的评论去搜了关于integer的知识,我明白integer内部有缓存,比如超过127会重新新建一个类,这样的sync锁的就是不同的对象了,可是如果是-128 - 127之间,会重用缓存,那他们不就是同一个对象了吗,为什么还会锁不住呢?

    作者回复: 如果100个人的项目都用这个缓存的对象做锁,还有人一直不释放,那整个系统都不了用了,锁也要隔离的

    2019-04-07
    1
    4
  • zws
    推荐 java 并发编程实战 加深理解。
    2019-03-29
    1
    4
  • zhangtnty
    王老师好,在第11讲中,new出的对象放入堆,局部变量放入栈桢。那么new出的线程会放到哪里?麻烦老师这块能否展开讲一下,谢谢😊

    作者回复: 线程也是个对象,对象的引用在栈里,对象在堆里

    2019-03-28
    4
  • 刘得淼
    “学好理论有思路,关注细节定成败。”通过学前几章,帮助项目组里解决个并发的bug。现学现卖。

    作者回复: 看来学的很好😃

    2019-03-28
    3
  • 探索无止境
    对于Nginx为什么属于IO密集型的?我的理解是这样,这个也要看场景,Nginx作为反向代理服务器,那么它会通过负载均衡策略调用后端的服务器,而远程调用属于IO操作,所以此处Nginx作为IO密集型的操作。但因为它 采用的是非阻塞IO模型,所以工作的方式又类似于CPU密集型,所以设置的最佳线程数为CPU的核数。不知道这样的理解是否正确?请老师指正

    作者回复: 正确,nginx里一般都是设置成worker进程和CPU一一对应的

    2019-08-26
    1
  • 凌尘
    真的不错,让人受益匪浅~

    作者回复: 😄

    2019-08-13
    1
  • 江湖夜雨
    redis是不是也是IO密集型,所以设置为单线程?

    作者回复: 是的

    2019-07-28
    1
  • code-artist
    老师讲得深入浅出
    2019-07-20
    1
  • Ryan
    第二模块出了么?老师

    作者回复: 周六出

    2019-03-29
    1
  • 李湘河
    复习了一遍想问老师一个问题,我对java中synchronized理解是只能解决可见性和原子性问题,不能解决有续性问题,但是java中synchronized是管程模型的实现,而管程模型可以解决并发编程里的所有问题(同步和互斥),这个意思是也可以解决java内存模型中的有续性问题吗?不知道我的理解对不对,还请老师解答一下?

    作者回复: 能解决有序性,会禁止重排的

    2019-03-28
    1
  • QQ怪
    总结的真好
    2019-03-28
    1
  • 彭锐
    String s1 = "lock";
    String s2 = "lock";
    这两个是一个对象,即重用了。代码上看起来是操作了一个,其实是操作了两个。

    作者回复: 这个例子好

    2019-03-28
    1
  • 赤城
    nginx采用多进程单线程就可以实现高并发访问的处理,具体是怎么实现的呢?
    2019-11-05
收起评论
44
返回
顶部