活跃性(Liveness)

2023-10-27

   一个并发应用能够及时执行任务的特性称为活跃性,这一节讲述最常见的一种活跃性问题–死锁,并将简单的介绍另外两种活跃性问题,分别为饥饿和活锁。

死锁(Deadlock)
   死锁描述的是这样一种情景,当两个或者多个线程处于永远阻塞状态,并等待对方,如下一个例子:

A和B是朋友,并且有良好的礼仪习惯。礼节中有一项规则,就是当你向朋友躬身时,你必须一直保持弓着状态以让你的朋友有机会躬身回礼,不幸的是,这个规则不会导致两个朋友同时向对方躬身可能性,以下例子,死锁,模拟了这种可能性:

public class Deadlock{
    static class Friend{
        private final String name;
        pulibc Friend(String name){
            this.name = name;
        }

        public getName(){
            return this.name;
        }

        public synchronized void bow(Friend bower){
            System.out.format("%s: %s" + "  has bowed to me!%n",  this.name, bower.getName());
            bower.bowBack(this);
        }

        public synchronized void bowBack(Friend bower){
            System.out.format("%s: %s" + " has bowed back to me!%n", this.name, bower.getName());   
        }
    }
public static void main(String[] args){
    final Friend a = new Friend("a");
    final Friend b = new Friend("b");
    new Thread(new Runnable(){
        public void run(){
            a.bow(b);
        }
    }).start();

    new Thread(new Runnable(){
        public void run(){
            b.bow(a);
        }
    }).start();
}
} 

   两个线程试图调用bowBack方法将会都处于阻塞状态,没有一个阻塞会终止,因为每个线程都等待这对方退出bow方法,这时,死锁就发生了。

饥饿和活锁
   比起死锁,饥饿和活锁更少发生,但是它们仍然是每个并发软件会遇到的问题。

   饥饿(Starvation)
   它描述了这样一个场景,当一个线程不能获取定期访问来共享资源而不能继续运行,在共享资源被饥渴线程长期占有时,就会发生饥饿。例如,加速一个对象提供一个要花很长时间才能返回结果的同步方法,如果一个线程频繁调用这个方法,其它线程也需要频繁调用同步进入同一个对象的方法时,阻塞就发生了。

   活锁(Livelock)
   一个线程经常对另外一个线程的响应做响应的处理,如果线程的另外一个动作同样是对另外一个线程响应而发生,结果可能导致活锁,类似死锁,发生活锁的线程不能更进一步的处理,然而,线程并没有被阻塞,他们只是忙碌于响应对方而重复工作,这类似于两个人在走廊中试图让对方,a移向左以让b通过,而b移向右以让a通过,可以看到,他们仍然互相阻塞,a移动到右边,而b移动到左边,结果他们仍然还是阻塞着。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

活跃性(Liveness) 的相关文章

随机推荐

  • Nginx修改文件配置--配置本地网址

  • seata-server-1.5.2的环境搭建

    配置文件位置 使用的是nacos和mysql数据库 简单部署在Win10上 Linux上配置修改相同 启动命令不同 找到 seata server 1 5 2 seata conf目录下的application yml和applicatio
  • win10 vscode+clangd代码提示+cmake+mingw编译器和调试器

    win10 vscode clangd代码提示 cmake mingw编译器和调试器 前言 第一步 把cmake mingw llvm win64安装好 安装好vscode必备的插件 利用cmake构建一个项目 利用vscode的launc
  • 移动端VUE实现一周课程表

    效果图 点击课程弹出课程详情 代码 使用嵌套的v for循环去实现
  • m3u8文件中的 m3u8标签与属性说明

    EXTM3U 每个M3U文件第一行必须是这个tag 请标示作用 EXT X VERSION 3 该属性可以没有 EXT X MEDIA SEQUENCE 140651513 每一个media URI在PlayList中只有唯一的序号 相邻之
  • ubuntu18.04安装cuda、cudnn、pytorch-gpu

    cuda安装 参考博客 https blog csdn net mbdong article details 121926316 https mp weixin qq com s ZTzfC7xp8PVMvOONVIiK6g https b
  • Vue简单实例——Vuex代码实现

    简单介绍 上一篇我们介绍了Vuex的理论 这一章我们开始说明Vuex在代码方面的实现 基本使用 要想使用Vuex首先要进行下载 在下载的时候需要注意 如果你使用的vue2的框架 需要使用vuex的3版本 如果使用的是vue3的框架 才可以使
  • Open3D DbScanClustering聚类算法及聚类分簇可视化及存储

    DBSCAN聚类算法 是基于密度的聚类算法 该算法需要两个参数 labels np array pcd cluster dbscan eps 0 02 min points 10 print progress True 入参 eps 定义到
  • Java实体类与byte数组相互转换

    1 使用ByteArrayStream 和 ObjectStream public abstract class ByteConvert public byte getByte try ByteArrayOutputStream out n
  • Qt技巧:sqlite数据库 判断表是否存在

    m dbTest QSqlDatabase addDatabase QSQLITE m dbTest setDatabaseName sqlite db if m dbTest open qDebug lt lt database succ
  • Android安卓期末大作业 新闻app 实现注册登录增删改查功能

    Android安卓期末大作业 新闻app 文末附下载链接 app情况如下图所示 点我下载 https download csdn net download weixin 43474701 75953692
  • 泛微oa明细表添加按钮_关于E8,这些快捷方式你必须知道

    摘要 快捷方式不只是快 更能带来酣畅用户体验 本期场景为您带来E8快捷方式精选 看着那些大神们手指翻飞 在键盘上灵活起舞 说实话 你有过几分羡慕吗 快捷输入这东西 有时候真是少不了 虽然只是几秒几十秒的差异 但用户体验着实不同 试想 当你正
  • 基于OpenCV的数码管数字识别

    利用OpenCV可实现工业仪表设备的读数识别 仪表一般可分为两 数字式仪表和指针式仪表 本博文主要介绍一下数字式仪表识别的关键技术 下图是用软件模拟的数码管图片 本文识别的也就是图中的数字 一 图像定位 在实际的应用场景中 拍摄到的仪表区域
  • SparkStreaming与Kafka010之05之01 Consumer

    package Kafka010 import Kafka010 Utils MyKafkaUtils import org apache kafka clients consumer ConsumerRecord import org a
  • Java的Timer定时任务的一个小Demo

    今天遇到一个需求 需要读取数据库的地址 返回地址的经纬度和所属区县 但是由于数据库的地址信息会没有或者错误 那么我的循环就会停止 于是想到写一个定时任务来解决这个问题 下面是定时任务的一个小Demo 希望可以帮到需要的人 package e
  • c#基础知识---集合之点阵列(BitArray)

    BitArray 类管理一个紧凑型的位值数组 它使用布尔值来表示 其中 true 表示位是开启的 1 false 表示位是关闭的 0 当您需要存储位 但是事先不知道位数时 则使用点阵列 您可以使用整型索引从点阵列集合中访问各项 索引从零开始
  • 吉林大学软件学院计网复习知识点

    吉林大学软件学院计网复习知识点 目录 前言 单项选择题知识点 填空题知识点 名词解释题知识点 简答题知识点 应用题知识点 课后习题答案 尾声 前言 大家好 我是星辉 以上便是根据我手头的资料整理的 希望能够对大家有些许的帮助 目前分为两部分
  • java对象引用改变地址_Java 使用调用方法改变了对象的地址后,主函数中输出结果不变...

    今天看引用传递 值传递相关的东西 说到String的值自初始化后不能修改 我就想 如果调用函数改变了String类对象的引用 那主函数里头的输出结果会不会变化 结果发现不行 同样的 今天看引用传递 值传递相关的东西 说到String的值自初
  • 力扣二叉树--对称二叉树,从上向下打印二叉树刷题

    给你一个二叉树的根节点 root 检查它是否轴对称 示例 1 输入 root 1 2 2 3 4 4 3 输出 true 示例 2 输入 root 1 2 2 null 3 null 3 输出 false 查询对称二叉树 主要用途在于判断一
  • 活跃性(Liveness)

    一个并发应用能够及时执行任务的特性称为活跃性 这一节讲述最常见的一种活跃性问题 死锁 并将简单的介绍另外两种活跃性问题 分别为饥饿和活锁 死锁 Deadlock 死锁描述的是这样一种情景 当两个或者多个线程处于永远阻塞状态 并等待对方 如下