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

2019-07-04  本文已影响0人  刘一一同学

1. 死锁

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

1.1 死锁产生条件

1.2 死锁解决办法

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

2. 活锁

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

3. 饥饿锁

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

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

4. 无锁

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

上一篇 下一篇

猜你喜欢

热点阅读