13 | 理论基础模块热点问题答疑
王宝令
该思维导图由 AI 生成,仅供参考
到这里,专栏的第一模块——并发编程的理论基础,我们已经讲解完了,总共 12 篇,不算少,但“跳出来,看全景”你会发现这 12 篇的内容基本上是一个“串行的故事”。所以,在学习过程中,建议你从一个个单一的知识和技术中“跳出来”,看全局,搭建自己的并发编程知识体系。
为了便于你更好地学习和理解,下面我会先将这些知识点再简单地为你“串”一下,咱们一起复习下;然后就每篇文章的课后思考题、留言区的热门评论,我也集中总结和回复一下。
那这个“串行的故事”是怎样的呢?
起源是一个硬件的核心矛盾:CPU 与内存、I/O 的速度差异,系统软件(操作系统、编译器)在解决这个核心矛盾的同时,引入了可见性、原子性和有序性问题,这三个问题就是很多并发程序的 Bug 之源。这,就是01的内容。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了Java并发编程的理论基础,涵盖了可见性、原子性、有序性等重要问题,以及Java内存模型和互斥锁方案的解决方法。此外,还讨论了线程间的协作机制、管程的重要性以及锁的最佳实践等内容。作者强调了深入理解和应用技术的重要性,以及对细节的关注。文章还提出了关于最佳线程数的思考题,强调了在并发编程领域细节的重要性。总的来说,本文为读者提供了系统的并发编程理论基础知识梳理,以及一些实用的技术建议和注意事项。文章内容丰富,既有理论深度又有实践指导,适合对并发编程感兴趣的读者阅读学习。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 并发编程实战》,新⼈⾸单¥59
《Java 并发编程实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(75)
- 最新
- 精选
- Jialin建议iamNigel同学去搜索下Integer String Boolean相关的知识,Integer会缓存-128~127这个范围内的数值,String对象同样会缓存字符串常量到字符串常量池,可供重复使用,所以不能用来用作锁对象,网上有相关的知识讲解和面试问题 老师讲解的非常不错,单看每一节,觉得自己已略一二,学完这节才发现要自己的知识点要串起来,整体了解并发
作者回复: 感谢帮忙回复!
2019-03-28270 - linqw学完这模块,自己理下,老师帮忙看下哦 1、产生并发的原因:cpu、内存、磁盘速度的差异,在硬件和软件方面解决速度差异引发的并发问题,cpu缓存->可见性,线程切换->原子性,编译优化->重排序,引发并发问题的根源。 2、并发的解决:可见性解决方法->volatile、synchronized,原子性的解决方法->互斥锁,重排序->volatile,禁掉编译优化 3、解决并发原子性产生的问题:死锁,死锁产生的所有条件->①资源互斥②不能抢占③占有且等待④循环等待,死锁的解决办法->①按锁的顺序获取②增加锁的分配器。 4、宏观角度分析,以上都是从微观角度进行分析并发问题,宏观,即安全问题,性能问题,活跃性问题 5、本质看问题,管程 6、实际看问题,java生命周期,线程数的分配,线程的执行 7、以子之矛攻子之盾,面向对象解决并发问题, 属性final、私有、只有getter方法没有setter方法,属性的赋值,深复制再进行操作等等
作者回复: 很全面了
2019-03-30469 - Demon.Lee这个课程99便宜了,建议涨价,一定要反复多看几遍
作者回复: 这个建议可以多提😃
2019-03-28832 - 探索无止境对于Nginx为什么属于IO密集型的?我的理解是这样,这个也要看场景,Nginx作为反向代理服务器,那么它会通过负载均衡策略调用后端的服务器,而远程调用属于IO操作,所以此处Nginx作为IO密集型的操作。但因为它 采用的是非阻塞IO模型,所以工作的方式又类似于CPU密集型,所以设置的最佳线程数为CPU的核数。不知道这样的理解是否正确?请老师指正
作者回复: 正确,nginx里一般都是设置成worker进程和CPU一一对应的
2019-08-2616 - zhangtnty王老师好,在第11讲中,new出的对象放入堆,局部变量放入栈桢。那么new出的线程会放到哪里?麻烦老师这块能否展开讲一下,谢谢😊
作者回复: 线程也是个对象,对象的引用在栈里,对象在堆里
2019-03-2815 - 皮卡皮卡丘看下源码就知道了,Integer里有个内部类,会缓存一定范围的整数
作者回复: 感谢帮忙回复!
2019-03-2812 - 江湖夜雨redis是不是也是IO密集型,所以设置为单线程?
作者回复: 是的
2019-07-28310 - 彭锐String s1 = "lock"; String s2 = "lock"; 这两个是一个对象,即重用了。代码上看起来是操作了一个,其实是操作了两个。
作者回复: 这个例子好
2019-03-2828 - Carpoor奇老师,因为String ,Integer,Boolean有缓存之后,虽然我们代码定义了两个对象,但是实际上这两个引用都指向堆里的同个对象,(值相同的情况)所以选择其中一个对象加锁了,实际上另一个对象也被加锁了 如果两个引用指向的值不同就没有问题,当两个引用指向的值相同就有问题了 这样理解对吗?
作者回复: 对
2019-12-1227 - 刘得淼“学好理论有思路,关注细节定成败。”通过学前几章,帮助项目组里解决个并发的bug。现学现卖。
作者回复: 看来学的很好😃
2019-03-287
收起评论