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、
13、锁膨胀