-
搞清楚一下概念的区别:进程与线程,并发与并行,同步与异步
-
知道创建新线程的三种创建方法以及特点(继承,接口,返回值
-
知道一个线程占用一块栈内存(想象成一个容器),这个容器里是栈帧也就是方法
-
知道方法区别:start和run,sleep与yield区别
-
知道以下方法的作用:join与interrupt,重点知道interrupt能够打断非运行非状态
-
知道线程的六种状态
-
知道线程在start之后不会被立即执行,而是进入阻塞(资源io未到),或者是就绪(此时时间片没有轮到线程)
-
只有当线程创建并自发竞争时才会进入blocked
-
知道守护线程:例子:垃圾回收线程,在所有非守护线程结束的时候,守护线程结束
-
知道临界区的概念,知道synchronized关键字的使用方法(还可以加在方法体上。
-
知道monitor机制:synchronized的obj是包含一个monitor对象的,这个monitor又包含一个owner对象,第一个线程来的时候会与monitor,以及owner绑定,其它线程来访问的时候要检查这两个对象是否有绑定。
-
monitor是重量锁,为了优化(上来不加重量所monitor),而产生了轻量锁
-
知道cas(乐观锁)机制:cas的三个参数 内存值,期望值,修改后的值
-
每个线程的栈帧都会包含一个锁记录对象,内部可以存储锁定对象的mark word
-
了解几种级别的锁是如何实现的:主要是通过obj的叫markword的参数设置不同值实现的。00轻量,01重量。
-
每个线程使用cas去替换markwod的参数来占领该锁对象
-
先加轻量锁,之后如果有线程尝试修改markword就会导致markword与monitor绑定变为重量锁,而这个触犯轻量锁的线程会去entrylist里阻塞。
-
了解自旋优化:为了避免出现阻塞(浪费资源调度,会让线程一直while询问是否完成
-
可重入优化:避免每次的cas操作,引入线程id到markword,发现是本线程id,不cas修改markword。
-
竞争导致blocked,锁释放唤醒
-
调用wait方法进入waitset等待,只能通过notify唤醒
-
注意blocked与wating这两个状态的区别
-
注意sleep与wait这两个方法的区别:sleep不释放锁
-
注意park同样也不释放锁
-
注意unpark用来唤醒指定进程
-
知道reentrantlock
-
知道每个线程有threadlocal,存放本线程的变量(注意不是threadpool
-
知道InheritableThreadLocal,它能够让父线程中ThreadLocal的值传给子线程。
-
知道jmm的三大特性:原子性,可见性,有序性
-
知道jmm定义了主存(共享内存)与工作内存(线程私有内存)的概念
-
volatile不能保证原子性,只能保证可见性与有序性
-
volatile的可见性是通过禁用高速缓存实现的
-
volatile的有序性是通过内存屏障实现的
-
内存屏障分为写屏障与读屏障,写屏障向上阻挡,读屏障向下阻挡,所以要注意读写操作的位置。
-
知道String的不可变,知道substring方法维护不可变的切割原理(保护性拷贝)
-
final保证只读而不写,也就保护了安全性