基础概念
启动线程的三种方式?所谓的第三种他可能想说线程池
- 一个进程里最小的一个执行单元叫线程
yield没有用过。什么场景需要用呢?
线程的状态
- new
- runnbale:ready running
- blocked
- waiting
- timedWaiting
- terminated 这个就不能在start了。
- 关闭线程就是正常结束了。
stop这个方法不要用。 - 了解下
interrupt getStat()得到状态
synchronize
- 锁 是 某个对象(不要用String Integer Long)。拿到锁能执行下面的代码(null能作为锁吗?)
- synchronize方法和synchroniz(this)是等价的。
- 静态方法是没有this的。在静态方法上synchronize等价于synchronize(T.class)
- T.class 一般是单例的(classloader)。
- synchronize可重入锁
- 遇到异常 锁被释放
细节(hotspot)
- 早期1.5之前,锁很重
- 后来有了锁升级的概念。
- synchronize(obj) 锁就是个对象。对象头中
Mark Word第一个线程来的时候记录了线程的ID。(偏向锁)效率高。 - 如果有线程来争用,升级为自旋锁(一个线程占着锁,另一个线程在旁边自旋。用户态不是内核态)10次以后升级为重量级锁
- 加锁代码执行时间长用OS锁。时间短,线程数少用自旋锁
JUC同步工具
同步容器
线程池
高频面试加分项
Disruptor
单机性能最高的MQ