一、前言
计算机组成原理
计算机操作系统
数据结构与算法
备注:相声有四门基本功:说、学、逗、唱;编程也有四门基本功:机组原理、操作系统、数据结构预算法、计算机网络
二、知识储备
1、什么是进程、什么是线程
进程: CPU分配资源的基本单位。如何判断CPU运行的进程个数?即一个多核CPU有多少个待CPU执行的任务,就有多少个进程正在运行(即有多少的程序/PID)。
线程: CPU执行的基本单位。如何判断CPU运行的线程个数?即每一个进程有多少基本单位在执行。
2、当代cpu与存储器结构及速率比较
CPU包含:ALU<1ns(算术逻辑单元)、L0<1ns(寄存器)、L1≈1ns(一级缓存)、L2≈3ns(二级缓存)、L3≈15ns(三级缓存)
存储器包含:L0<1ns(寄存器)、L1≈1ns(一级缓存)、L2≈3ns(二级缓存)、L3≈15ns(三级缓存)、L4≈80ns(内存/主存)、L5(磁盘)、L6(远程文件服存储等)
3、CPU、内存、南北桥、PCI总线的运行逻辑
北桥:靠近CPU的为北桥芯片,主要负责控制AGP显卡、内存与CPU之间的数据交换;
南桥:靠近PCI槽的为南桥芯片,主要负责鼠标、硬盘、键盘、网卡以及附加卡的数据交换。
关系:传统的南北桥架构是通过PCI总线来连接的
4、cpu是乱序执行的,并且多核cpu存在缓存同步
证明cpu是乱序执行的(CPU层级)
证明JVM存在指令重排(Hotsport层级)
证明cpu存在缓存同步,即存在MESI缓存一致性协议(OS层级)
5、数据结构、算法及理论
双向链表
栈
队列
CLH
AQS
CAS
自旋
6、java的Unsafe操作
unpark();
park();
compareAndSwapObject();
...
三、线程的生命周期
1、java有几种创建线程方式?
a、本质上只有两种创建线程的方式
集成Thread类
实现Runnable接口
b、其他基于以上两种方式创建线程的外在表现
lambda表达式
Future接口
Callable接口
ThreadPool
2、如何正确启动线程?
正确:start()
错误:run()
3、如何正确停止线程?
正确:interrupt()
错误:stop()
4、线程生命周期的状态是如何转换的?
a、new -> runnable -> terminated
b、runnable -> blocked -> runnable
c、runnable -> waiting -> runnable
d、runnable -> time_waiting -> runnable
四、多线程安全
1、什么是线程安全
当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协同操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。——《Java Concurrency In Practice》
2、多线程三大特性
原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
有序性:程序执行的顺序按照代码的先后顺序执行。
3、synchronized
要点:加锁实现原子性
a、java代码层级:
加了synchronized关键字
b、字节码层级:
加了monitorenter, monitorexit
c、hotspot层级:
d、汇编码层级
重量级锁添加lock
4、volatile
要点:汇编 lock 实现了 volatile 的「防止指令重排」「内存可见」的特性
a、java代码层级
加了volatile关键字
b、字节码层级
属性上添加ACC_Volatile修饰
c、hotspot层级
内存屏障java规范
在每个volatile写操作的前面插入一个StoreStore屏障。
在每个volatile写操作的后面插入一个StoreLoad屏障。
在每个volatile读操作的后面插入一个LoadLoad屏障。
在每个volatile读操作的后面插入一个LoadStore屏障。
as-if-serial 原则
happens-before 原则
源码:
inline void OrderAccess::fence() {
// always use locked addl since mfence is sometimes expensive
#ifdef AMD64
__asm__ volatile ("lock; addl $0,0(%%rsp)" : : : "cc", "memory");
#else
__asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory");
#endif
compiler_barrier();
}
d、汇编码层级
lock addl $0x0,(%rsp)
e、OS层级
lock会触发缓存一致性协议,使用到该缓存行的其他cpu核的缓存失效。
5、AQS之ReentrantLock
五、实战
1、DCL单例
2、两个线程交替打印
3、多线程校验,尽快返回。即只要有一个线程false,停止其它线程。
4、死锁
5、发布逸出