活跃度 && reentranlock

类型 解决方案
1.死锁:互相等待对方释放临界资源,导致现场的阻塞 顺序取锁,一次性取ab锁
2.活锁:两个线程的执行逻辑和终止逻辑互斥,导致线程一直活着 交错执行
3.饥饿:由于顺序取锁导致某些线程一直无法获得cpu执行权
可重入锁

image1

可打断 lock.lockInterruptibly();

别的线程调用

Lock.interrupt()

即可叫等待线程别死等了,

赶紧换棵树吧

  • 可打断 = 等锁期间能被中断,不会永远阻塞

  • 不可打断 = 等锁期间不能被中断,只能等到锁释放

锁超时:tryLock(timeout,sec/nanos/mil)

等待一定时间获取锁,过时则矣

公平性 按阻塞队列来,都给我排队去,可以用fairSync(),会降低并发度

条件变量(condition):

由于每个线程wait的原因不同,

但是java只提供了notifyAll/notify的方法,
会造成虚假唤醒

因此ReentrantLock提供了condition条件变量.

我们通过rel.newCondition.var

通过这个condition调用await和signal方法

这样就能只唤醒等待特定条件的线程,

(烟/外卖)

从而解决虚假唤醒

image2