1. 死锁
多个线程之间相互争夺资源,而又相互等待对方释放资源,此时线程阻塞出现假死状态,形成死锁。
1.1 死锁产生条件
- 互斥条件:所谓互斥就是进程在某一时间内独占资源。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
1.2 死锁解决办法
- 如果并发查询多个表,约定访问顺序。
- 在同一个事务中,尽可能做到一次锁定获取所需要的资源。
- 对于容易产生死锁的业务场景,尝试升级锁颗粒度,使用表级锁。
- 采用分布式事务锁或者使用乐观锁。
2. 活锁
多线程中出现了相互谦让,都主动将资源释放给别的线程使用,这样资源在多个线程之间跳动而又得不到执行,形成活锁。
3. 饥饿锁
一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行的状态。多线程中优先级高的会优先执行,并且抢占优先级低的资源,导致优先级低的线程无法得到执行。
与死锁不同的是,饥饿锁在一段时间内,优先级低的线程最终还是会执行的,比如高优先级的线程执行完之后释放了资源。
4. 无锁
即没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。如果有多个线程修改同一个值必定会有一个线程能修改成功,而其他修改失败的线程会不断重试直到修改成功无锁(JDK的CAS
)。
网友评论