线程八大核心+Java并发原理及企业级并发解决方案 Study Notes

慕课网实战课程《线程八大核心+Java并发原理及企业级并发解决方案》学习笔记
Reference
- 源课程链接:《线程八大核心+Java并发原理及企业级并发解决方案》
- Java线程八大核心脑图
- 随课整理:Java并发常见面试题
第1章 开宗明义
为什么需要学习并发编程
- 源于JD的硬性要求,尤其是大厂
- 网络上的博客、面经水平参差不齐,难辨真伪
- 掌握并发编程是成为高级工程师的必要、
- 并发是众多框架的原理和基础(Spring中的线程池,数据库中的乐观锁,Log4j对阻塞队列的运用)
第2章 线程八大核心纵观全貌
脑图
线程八大核心概述
- (1)如何实现多线程【基础】
- 实现多线程的方法到底有1种还是2种还是4种 ?
- (2)线程的正确启动【基础】
- (3)线程的正确停止【重点/难点】
- (4)线程的6个状态(生命周期)【重点/难点】
- (5)Thread和Object类中的重要方法详解
- (6)线程的各个属性
- 线程的名称、守护线程等
- (7)未捕获异常如何处理
- Java并发多线程中的异常跟普通的Java异常有很大不同
- (8)并发中多线程的优劣
- 双刃剑:多线程会导致的问题
第3章 核心1:实现多线程的正确姿势【解读官方文档】
实现多线程的2种方式
- 官网:Oracle的JDK中描述一共有2种实现多线程的方法
- 方法1:实现Runnable接口
- 方法2:继承Thread类
- 方法1 VS 方法2
- 方法1更好,方法2的缺点主要有3个:
- 代码架构角度:任务应该和业务解耦
- 新建线程损耗:方法2每次新建任务,都需要新建一个线程,新建独立线程开销大
- Java不支持双继承,方法1扩展性更好
- 两种方法的本质(都执行run方法,但run方法来源不同)
- 方法1:
target.run()
- 方法2:
run()
方法整个被重写
- 方法1:
- 方法1更好,方法2的缺点主要有3个:
思考题:如果同时使用两种实现的多线程方式?具体会执行哪个?
- 从面相对象的方式来思考,最终会执行继承Thread类方式实现多线程中的代码,因为run方法被重写了
创建线程总结
- 准确的讲,创建线程只有一种方式那就是构造Thread类,而实现线程的执行单元有两种方式
- 方法1:实现Runnable接囗的run方法,并把Runnable实例传给Thread类
- 方法2:重写Thread的run方法(继承Thread类)
*学习编程知识的优质路径
宏观上
- 并不能靠工作年限(有的人工作了5年技术却还是只懂皮毛)
- 要有强大的责任心,不放过任何bug,找到原因并去解决,这就是提高
- 主动:永远不会觉得自己的时间多余,重构、优化、学习、总结
- 敢于承担:虽然这个技术难题以前没碰到过,但是在一定的了解调研后,敢于承担技术难题,让工作充满挑战,这一次次攻克难关的过程中,进步是飞速的。
- 关心产品,关心业务,而不只是写代码
微观上(目的:系统全面的学习)
- 看经典书籍(外国人写的经典的中国译本,比如说Java并发编程实战、自顶向下计算机网络)
- 看官方文档
- 英文搜google和stackoverflow
- 自己动手写,实践写demo,尝试用到项目里
- 不理解的参考该领域的多个书本,综合判断
- 学习开源项目,分析源码(学习synchronized原理,反编译 看cpp代码)
如何了解技术领域的最新动态
- 高质量固定途径:ohmyrss.com(信息源选,为我所用)
- 科技爱好者周刊
- 阮一峰的博客
- 四火的唠叨
- 订阅技术网址的邮件:InfoQ(每周都看)
- 公众号不推荐作为技术知识来源,质量无法保证
如何在业务开发中成长
- 偏业务:
- 整理业务知识,把业务抽象成核心模型,提炼核心技术;
- 考虑的长远一些,如果未来流量有了巨大的增加,应该如何应对,如何设计系统架构
- 偏技术:通用性强
- 两个25%理论:在技术上达到前25%,在自己擅长的领域达到25%,两者结合起来就能到前5%
实现多线程&常见面试问题
第4章 核心2:开启多线程启动的世界
start()
- 在主线程中调用了线程的
start()
方法后:- (1)启动新线程检查线程状态
- (2)加入线程组
- (3)调用
native start0()
start()
方法含义- 启动新线程
- 准备工作
- 不能重复调用start0()
第5章 核心3:线程停止、中断之最佳实践
Reference
Remark
- xxx需要再深入学习
1 | <font color=red></font> |