死锁、活锁、饥饿锁、无锁

1. 死锁

多个线程之间相互争夺资源,而又相互等待对方释放资源,此时线程阻塞出现假死状态,形成死锁。

1.1 死锁产生条件

  • 互斥条件:所谓互斥就是进程在某一时间内独占资源。
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  • 不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

1.2 死锁解决办法

  1. 如果并发查询多个表,约定访问顺序。
  2. 在同一个事务中,尽可能做到一次锁定获取所需要的资源。
  3. 对于容易产生死锁的业务场景,尝试升级锁颗粒度,使用表级锁。
  4. 采用分布式事务锁或者使用乐观锁。

2. 活锁

多线程中出现了相互谦让,都主动将资源释放给别的线程使用,这样资源在多个线程之间跳动而又得不到执行,形成活锁。

3. 饥饿锁

一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行的状态。多线程中优先级高的会优先执行,并且抢占优先级低的资源,导致优先级低的线程无法得到执行。

与死锁不同的是,饥饿锁在一段时间内,优先级低的线程最终还是会执行的,比如高优先级的线程执行完之后释放了资源。

4. 无锁

即没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。如果有多个线程修改同一个值必定会有一个线程能修改成功,而其他修改失败的线程会不断重试直到修改成功无锁(JDK的CAS)。

你可能感兴趣的:(死锁、活锁、饥饿锁、无锁)