Java 并发编程实战
王宝令
资深架构师
72485 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
学习攻略 (1讲)
Java 并发编程实战
15
15
1.0x
00:00/00:00
登录|注册

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

学好理论有思路,关注细节定成败
最佳线程数的确定
正确处理方式
日志级别设置为INFO时的参数计算
组合操作可能导致线程安全问题
不同应用场景的性能表现
锁的最佳实践
合理的受保护资源与锁的关联关系
线程内部执行
计算合适的线程数
线程的生命周期
解决并发问题的万能钥匙
线程间的协作机制:等待-通知
可能带来死锁问题
互斥锁方案
Java内存模型
可见性、原子性、有序性问题
CPU与内存、I/O速度差异
总结
理论值 or 经验值
InterruptedException异常处理需小心
方法调用是先计算参数
竞态条件需要格外关注
锁的性能要看场景
用锁的最佳实践
面向对象思想写好并发程序
线程相关知识
管程
互斥锁问题
解决核心问题
系统软件解决核心矛盾
硬件核心矛盾
并发编程理论基础模块

该思维导图由 AI 生成,仅供参考

到这里,专栏的第一模块——并发编程的理论基础,我们已经讲解完了,总共 12 篇,不算少,但“跳出来,看全景”你会发现这 12 篇的内容基本上是一个“串行的故事”。所以,在学习过程中,建议你从一个个单一的知识和技术中“跳出来”,看全局,搭建自己的并发编程知识体系。
为了便于你更好地学习和理解,下面我会先将这些知识点再简单地为你“串”一下,咱们一起复习下;然后就每篇文章的课后思考题、留言区的热门评论,我也集中总结和回复一下。
那这个“串行的故事”是怎样的呢?
起源是一个硬件的核心矛盾:CPU 与内存、I/O 的速度差异,系统软件(操作系统、编译器)在解决这个核心矛盾的同时,引入了可见性、原子性和有序性问题,这三个问题就是很多并发程序的 Bug 之源。这,就是01的内容。
那如何解决这三个问题呢?Java 语言自然有招儿,它提供了 Java 内存模型和互斥锁方案。所以,在02我们介绍了 Java 内存模型,以应对可见性和有序性问题;那另一个原子性问题该如何解决?多方考量用好互斥锁才是关键,这就是0304的内容。
虽说互斥锁是解决并发问题的核心工具,但它也可能会带来死锁问题,所以05就介绍了死锁的产生原因以及解决方案;同时还引出一个线程间协作的问题,这也就引出了06这篇文章的内容,介绍线程间的协作机制:等待 - 通知。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Java并发编程的理论基础,涵盖了可见性、原子性、有序性等重要问题,以及Java内存模型和互斥锁方案的解决方法。此外,还讨论了线程间的协作机制、管程的重要性以及锁的最佳实践等内容。作者强调了深入理解和应用技术的重要性,以及对细节的关注。文章还提出了关于最佳线程数的思考题,强调了在并发编程领域细节的重要性。总的来说,本文为读者提供了系统的并发编程理论基础知识梳理,以及一些实用的技术建议和注意事项。文章内容丰富,既有理论深度又有实践指导,适合对并发编程感兴趣的读者阅读学习。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 并发编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(75)

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

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

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

    作者回复: 很全面了

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

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

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

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

    2019-08-26
    16
  • zhangtnty
    王老师好,在第11讲中,new出的对象放入堆,局部变量放入栈桢。那么new出的线程会放到哪里?麻烦老师这块能否展开讲一下,谢谢😊

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

    2019-03-28
    15
  • 皮卡皮卡丘
    看下源码就知道了,Integer里有个内部类,会缓存一定范围的整数

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

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

    作者回复: 是的

    2019-07-28
    3
    10
  • 彭锐
    String s1 = "lock"; String s2 = "lock"; 这两个是一个对象,即重用了。代码上看起来是操作了一个,其实是操作了两个。

    作者回复: 这个例子好

    2019-03-28
    2
    8
  • Carpoor奇
    老师,因为String ,Integer,Boolean有缓存之后,虽然我们代码定义了两个对象,但是实际上这两个引用都指向堆里的同个对象,(值相同的情况)所以选择其中一个对象加锁了,实际上另一个对象也被加锁了 如果两个引用指向的值不同就没有问题,当两个引用指向的值相同就有问题了 这样理解对吗?

    作者回复: 对

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

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

    2019-03-28
    7
收起评论
显示
设置
留言
75
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部