活跃度 && reentranlock
| 类型 | 解决方案 |
|---|---|
| 1.死锁:互相等待对方释放临界资源,导致现场的阻塞 | 顺序取锁,一次性取ab锁 |
| 2.活锁:两个线程的执行逻辑和终止逻辑互斥,导致线程一直活着 | 交错执行 |
| 3.饥饿:由于顺序取锁导致某些线程一直无法获得cpu执行权 |
| 可重入锁 |
|
|---|---|
可打断 lock.lockInterruptibly(); 别的线程调用 Lock.interrupt() 即可叫等待线程别死等了, 赶紧换棵树吧 |
|
锁超时:tryLock(timeout,sec/nanos/mil) 等待一定时间获取锁,过时则矣 |
|
| 公平性 | 按阻塞队列来,都给我排队去,可以用fairSync(),会降低并发度 |
条件变量(condition): 由于每个线程wait的原因不同, 但是java只提供了notifyAll/notify的方法, 因此ReentrantLock提供了condition条件变量. 我们通过rel.newCondition.var 通过这个condition调用await和signal方法 这样就能只唤醒等待特定条件的线程, (烟/外卖) 从而解决虚假唤醒 |
![]() |

