zoukankan      html  css  js  c++  java
  • java多线程系列-死锁与活锁的区别,死锁与饥饿的区别

    死锁:
    是指两个或者两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,他们都将无法推进下去
    产生死锁的原因:
    互相争夺共享资源

    产生死锁的必要条件:

    • 互斥条件:共享资源被一个线程占用
    • 请求与保持条件(占有且等待):一个进程因请求资源而阻塞时,对已获得的资源保持不释放
    • 不剥夺条件:进程已获得资源,在未使用完之前,不能强行剥夺
    • 循环等待条件:多个线程之前循环等待资源,必须是循环的互相等待

    只需要破坏上面4个必要条件的其中一个就能破坏,比如:

    • 请求与保持条件:放大锁范围,去除对资源的抢占
    • 不剥夺:换成可重入锁ReentrantLock
    • 循环等待:改成顺序加锁,避免循环等待
    • 互斥是多线程的特性,所以这个条件无法避免

    活锁:
    任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试、失败、尝试、失败。在这期间线程状态会不停的改变

    活锁与死锁的区别:
    死锁会阻塞,一直等待对方释放资源,一直处在阻塞状态;活锁会不停的改变线程状态尝试获得资源。活锁有可能自行解开,死锁则不行

    饥饿:
    一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行的状态。一直有线程级别高的暂用资源,线程低的一直处在饥饿状态。
    比如ReentrantLock显示锁里提供的不公平锁机制,不公平锁能够提高吞吐量但不可避免的会造成某些线程的饥饿

    死锁与饥饿的区别:
    线程处于饥饿是因为不断有优先级高的线程占用资源,当不再有高优先级的线程争抢资源时,饥饿状态将会自动解除。

    产生饥饿的原因:

    • 高优先级线程抢占资源
    • 线程在等待一个本身也处于永久等待完成的对象
    • 线程被永久阻塞在一个等待进入同步快的状态,因为其他线程总是能在它之前持续地对该同步块进行访问
  • 相关阅读:
    [转]为iPhone4S和iOS5增加全局英汉词典教程
    Notes on MSBuild
    Using jQuery To Manipulate and Filter Data
    使用MSBuild进行自动化构建
    使用ADO.NET的计算列
    来自Twitter的前端工具包——Bootstrap
    Jquery Templetes简介
    C#导入导出Excel
    Mysql在sql中截取时间类型字段的年月日和时间
    使用NPOI导出Excel,并在Excel指定单元格插入图片
  • 原文地址:https://www.cnblogs.com/zh-ch/p/13138587.html
Copyright © 2011-2022 走看看