美文网首页
死锁、活锁、饥饿锁、无锁

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

作者: 刘一一同学 | 来源:发表于2019-07-04 09:59 被阅读0次

1. 死锁

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

1.1 死锁产生条件

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

1.2 死锁解决办法

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

2. 活锁

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

3. 饥饿锁

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

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

4. 无锁

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

相关文章

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

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

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

    死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地...

  • 死锁

    线程饥饿死锁 锁顺序死锁 动态锁顺序死锁通过锁顺序来避免死锁 避免死锁

  • 003 线程活跃性 | 死锁 | 活锁 | 饥饿 | 无锁

    死锁 两个或多个线程相互等待对方释放锁,则会出现死锁现象。java虚拟机没有检测,也没有采用措施来处理死锁情况,所...

  • 高并发编程-05-活跃性问题

    死锁,饥饿,活锁 1,死锁 多个线程,各自占对方的资源,都不愿意释放,从而造成死锁 工具:使用jconsole可以...

  • 死锁-活锁

    死锁大家都知道,但是 有没有老铁 知道活锁呢?我在看《并发编程实战》的时候 了解到这个名次 活锁 活锁 是指 活锁...

  • mysql锁机制

    1,数据库锁理论概述分类: 读锁、写锁。行锁,表锁,页锁。1.1 表锁:无死锁,加锁快加锁:lock tabl...

  • Java面试:多线程中的各种锁,你了解几个?

    学习 java 多线程时,最头疼的知识点之一就是 java 中的锁了,什么互斥锁、排它锁、自旋锁、死锁、活锁等等,...

  • MySQL日记——锁机制

    MySQL的锁一般分为三种 行锁 表锁 页锁 表锁 偏向MyISAM储存引擎,开销小,加锁快;无死锁;锁定粒度大,...

  • Java中的一些锁

    概念: 我们知道有活锁 死锁,活锁里面有悲观锁和乐观锁 1.悲观锁,我的理解是两个男孩张三和李四,在约同一个女孩恋...

网友评论

      本文标题:死锁、活锁、饥饿锁、无锁

      本文链接:https://www.haomeiwen.com/subject/llbecctx.html