===== synchronized =====
* 作用
* 多个线程依次执行某个代码块(串行执行),一个线程执行完后,通知其他线程继续执行
===== wait =====
* 作用
* 暂停一个线程
* 会释放持有的锁(释放调用wait的那个锁。如果还拥有其他锁,则不会释放)
* 特点
* 面向object
* 使用不灵活,只能notify任意一个线程,或者所有线程
* wait必须先于notify/notifyAll之前调用。(否则就会错过信号)
* 退出方式
* notify
* interrupt
===== park =====
* 作用
* 暂停一个线程
* 特点
* 面向线程
* 使用灵活,可以对任意一个线程进行park(),unpark()操作
* unpark可以先于park之前调用
* unpark将信号量设置成1(可用),park将信号量设置成0(不可用)
* 所以连续多次调用unpark其实没有效果
* 可以设置正在等待的对象(有利于排查问题)
* 退出方式
* unpark
* interrupt
LockSupport.parkNanos(10); 注意,这里park 10纳秒,实际上park操作本身就消耗了50000纳秒,所以park(10),park(100),park(1000)性能其实差不了多少
===== sleep =====
* 作用
* 睡眠
* 不会释放持有的锁
* 退出方式
* interrupt
===== join =====
* 作用thread2.join() 等待线程thread2退出
* 底层就是wait机制
===== yield =====
建议让出cpu(可能并不会让出)。程序中不能强依赖这种不确定性的逻辑