死锁 deadlock
死锁指两个或两个以上进程(或线程)持有或者循环持有彼此资源,导致相互等待现象,如无外力介入,系统不会自行解除等待状态。
活锁 livelock
活锁指的是进程(或线程)没有别阻塞等待,由于某些条件没有满足,导致一直重复尝试-失败-尝试-失败的过程。处于活锁的实体是在不断的改变状态,活锁有可能自行解开。
- 解决方案
- 引入一些随机性
- 约定重试机制,制定全局规则,避免再次冲突
饥饿 starving
一直在等待,但是获取不到资源,导致任务无法执行,如:优先级高的线程一直在插队,导致低优先级的线程无法获得执行机会。Java中的非公平锁,就有可能导致饥饿出现。另外,如果一个线程获得资源后,持续持有不释放,其他竞争该资源的线程也是出于饥饿状态。