1、wait 会释放cpu 也会释放锁 

2、sleep 只会释放cpu 不会释放锁

3、wait 和sleep 都可以用interrupt()方法唤醒,但是会抛出异常 抛出异常后

4、睡眠结束的线程未必立即执行

5、yield 让出cpu 让running 变为runable状态 ,但是有时候也存在让不出去的情况(比方说 没有其他线程要运行)

 

6、关于sleep和yield 区别:虽然都是等待,让出cpu,但是状态变化不同;sleep 由running -》time waiting  ,yield由running ——》runable

 

7、wait() 和wait(long timeout)区别:wait() 其实是调用的wait(0) 无限等待  wait(long timeout) 过了时间不会等待

8、wait 之后用notify 或者notifyAll唤醒  notify 随机唤醒一个  notify 全部唤醒

9、join 等待线程执行完  才会执行下边的代码

10、轻量级锁 自旋锁 偏向锁 重量级锁

默认是偏向锁

偏向锁有阈值 20、40 ,如果对象释放锁20次,jvm会觉得是不是加错锁了 就会换个线程给这个对象,如果释放40次,即便以后new的新对象都不会加偏向锁

线程知识点_加锁

 

 偏向锁-》轻量锁——》重量锁——》自旋锁(就是尝试多次加锁,避免上下文切换)

11、锁消除 jIL 计算时间的 默认会消除无用锁,需要设置一下vm 来去掉这个默认设置

12、synchronized加在方法上,加载静态方法上的区别

12、线程知识点_加载_02

 13、锁膨胀