1.1 两个技术面试故事
1. 面试故事一
候选人是一位至少有着6年以上的开发经验,毕业于某二本院校计算机专业、看上去非常老练的Java高级工程师,简称 L 君。L 君所应聘的岗位是一个网络设备配置管理类项目的MDE(模块设计师,Java主程)。该项目的特点是:有着8年历史代码积累,反复地修修补补,项目迫切需要进行架构解耦,想找一位开发基础扎实、擅长进行模块解耦的MDE。
为了考察 L 君的编程水平,笔者先给 L 君上了一道正餐前的开胃菜,出了一个比较简单的题目:
程序开发时为什么要用多线程,单线程不是很好吗?多线程有什么意义?多线程会带来哪些问题,如何解决?
以上问题对于一个合格的Java工程师来说是非常简单的。出人意料的是,这位有着6年以上开发经验的 L 君竟然没有答上来。L 君的理由是这个问题太理论、太基础,已经忘记其答案了。呜呼哀哉,这么简单的基础知识都忘记了。当然,L 君也就不好意思,只能有怏怏离去了。
为什么答不上来呢?可能的原因从 L 君的简历可以探知一二:L 君做了多年传统web开发,在工作过程中,估计 L 君完全是埋头干活,每天只顾着完成领导(开发经理)分配的小任务,完成Web模块的CRUD(增删改查)工作,完全没有去系统地看书学习和理解Java的基础知识,连基础的东西都丢了。
2.面试故事二
候选人是从重庆一所双一流大学毕业了一年的初级Java工程师,简称 Y 君。在面试前,Y 君已经过了一面,并且前面的同事反馈说 Y 君的技术不错。看上去Y君拿到 Offer 已经没什么悬念了。在面试时,考察多线程知识似乎已成习惯,在Y君自我介绍之后,于是一上来就出了古老的面试题:
什么是线程安全问题,“++”运算是不是线程安全的?
3.面试总结
两个真真切切的面试故事已经讲完。实际上,笔者面试过的很多候选人都有一个共性问题:Java基础知识尤其是多线程,高并发知识非常欠缺。所以很遗憾,很多候选人无缘优质Offer。
总体而言,多线程是Java程序运行的基础性机制
1.2无处不在的进程和线程
1.2.1
进程一直以来没有完美的定义,一般进程主要是程序段,数据段,进程控制块组成,进度控制块就说指PCB
1.2.2
线程是指一个进程代码段的一次顺序执行流程,线程是CPU调度的最小单位,一个进程包含一个或多个线程
Java程序的进程执行过程就是标准的多进程执行过程。每当使用Java命令执行一个类,实际上就是启动了一个JVM进程。理论上,在该进程的内部至少会启动两个进程,一个是main线程,另一个是GC(垃圾回收)线程。实际上,执行一个java程序,通过Process Explorer,远远不止两个,达到18个之多
1.2.3
1.3创建线程的4种方法
Thread类
Runnable
Callable和FutrueTask
线程池
1.4线程的核心原理
调度和时间片
线程优先级
线程周期
jstack工具
1.5线程的基本操作
线程名称的设置和获取
线程的sleep操作
线程的interrupt操作
线程的join操作
线程的yield操作
线程的daemon操作
线程状态总结
1.6线程池原理与实战
JUC的线程池架构
Executors的4种快捷创建线程池的方法
线程池的标准创建方法
向线程池提交任务的两种方式
线程池的任务跳读流程
任务阻塞队列
调度器的钩子方法
线程池的拒绝策略
线程池的优雅关闭
Executors快捷创建线程池的潜在问题
1.7确定线程池的线程数
1.8ThreadLocal原理与实战
待续(升级中......)