并发应用程序及时执行的能力被叫做它的活性。这块描述了最普通的活性问题,死锁(deadlock),接着简单描述了两个其他活性问题“饥饿锁和活锁”;

死锁

死锁描述了一种情形,两个或者更多的线程徐翔阻塞。,互相等待对方。这里是一个例子。

Alphonse和Gaston是好朋友,非常看重礼节。礼节的一个严格规定是当你向一个朋友鞠躬的时候,你必须保持鞠躬状态知道你的朋友向你鞠躬。不幸的是,这中规定没有考虑到这种可能性两个朋友同时向对方鞠躬。这个应用例子,死锁,模拟了这种可能。

public class Deadlock {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String 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 alphonse =
new Friend("Alphonse");
final Friend gaston =
new Friend("Gaston");
new Thread(new Runnable() {
public void run() { alphonse.bow(gaston); }
}).start();
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); }
}).start();
}
}

当死锁运行的时候,它极像两个线程努力调用bowBack时将互相阻塞。阻塞将永远不会结束,因为双方都在等待另一个退出bow。

饥饿和活锁

饥饿和活锁问题比死锁不常见。但是仍然是每个并发应用设计者可能遇到的问题。

饥饿

饥饿描述了这样的一种情形,饥饿描述的是一个线程不能定期的获取对共享资源的访问并且不能前进。当共享资源由于贪婪的线程长期占用而变得不可用就发生了。例如,假设一个对象提供了一个同步方法需要花费很长时间返回。如果一个线程频繁的调用这种方法,其他也需要频繁同步访问这个相同对象的线程就会被阻塞。

活锁(LiveLock)

A线程要以C线程执行后的响应才执行。如果B线程也是以C线程动作的响应才能执行。活锁就可能发生。和死锁一样,活锁的线程不能继续下一步动作。可是了,这些线程没有阻塞,它们只是忙于响应每个线程来重新工作。这就好比两个人在走廊中互相穿过对方:Alphonse 移动到他的左边让Gaston 过,而Gaston 移动到他的右边让Alphonse 过。看见他们仍然互相阻塞对方。Alphonse 移动到他的右边,而Gaston 移动到他的左边,他们仍旧阻塞对方,这样。。。。。

活性(Liveness)相关推荐

  1. 也谈PBFT/Tendermint/HotStuff中的活性问题、响应度问题和锁定问题

    文章目录 1. 写在前面 2.两/三阶段共识中的锁定机制 3.共识协议中Leader可信度的不同 4.Single-modal类共识中锁定机制的设计 4.1 对锁定机制中规则2活性的理解 4.2 为什 ...

  2. 还记得那场关于“分布式锁”的经典论战吗?

    锁的目的在于对于共享资源访问的一个互斥控制,单机场景下我们可以基于jvm的锁进行实现就ok了,分布式场景下的实现方案有很多,有人可能会想到基于redis实现. 有关Redis分布式锁的文章可谓多如牛毛 ...

  3. 基于 Redis 的分布式锁到底安全吗?

    [完整版] 网上有关Redis分布式锁的文章可谓多如牛毛了,不信的话你可以拿关键词"Redis 分布式锁"随便到哪个搜索引擎上去搜索一下就知道了.这些文章的思路大体相近,给出的实现 ...

  4. redis主从复制下哨兵模式---选举原理

    [前言]参考于此.也可参考其一系列文章,都是关于redis的总结,涉及redis搭建.事务.持久化.高可用.本文主要是高可用环节,其他可参考上一篇博客及文件里面的mmap思维导图. 一.哨兵机制 任务 ...

  5. 彻底厘清真实世界中的分布式系统

    [编者的话]本文从一个实践者的角度,首先介绍了分布式系统的一些理论结果,例如 FLP 不可能性和 CAP 定理等:然后介绍了构建实际分布式系统最重要的一个原则:端到端:最后讨论了实际系统经常用到的协调 ...

  6. Strong Consistency, 强一致性技术概述

    http://horicky.blogspot.com/2009/11/nosql-patterns.html A brief history of Consensus_ 2PC and Transa ...

  7. 基于Redis的分布式锁到底安全吗(上)?

    网上有关Redis分布式锁的文章可谓多如牛毛了,不信的话你可以拿关键词"Redis 分布式锁"随便到哪个搜索引擎上去搜索一下就知道了.这些文章的思路大体相近,给出的实现算法也看似合 ...

  8. Ouroboros:一个可证明安全的PoS区块链协议 (共识介绍)

    原文作者:Aggelos Kiayias∗ Alexander Russell† Bernardo David‡ Roman Oliynykov§ 摘要 我们向大家展示Ouroboros--第一个基于 ...

  9. kafka java 多线程_20. 多线程开发者实例

    # 多线程 Consumer Instance ## Kafka Java Consumer 设计原理 * Kafka Java Consumer 是单线程设计 * 从 Kafka V0.10.1.0 ...

  10. 简单易懂的 Raft 分布式共识算法讲义

    本文整理自 Ongaro 在 Youtube 上的视频,https://www.youtube.com/watch?v=vYp4LYbnnW8. 目标 Raft 的目标(或者说是分布式共识算法的目标) ...

最新文章

  1. python怎么写文件-Python读写文件
  2. HTTP 错误 404.3 – Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序...
  3. linux sybase系统,linux sybase 安装全过程(写给初学者)
  4. 倒数秒跳转页面实现代码。
  5. docker pull的镜像放在哪里_Docker 安装ELK及Docker常见命令
  6. 美团容器平台架构及容器技术实践
  7. CSS3 background-clip属性
  8. JavaScript文档对象模型DOM节点操作之删除节点(6)
  9. [滑模控制器浅述] (1) 二阶系统的简单滑模控制器设计
  10. 中职学校计算机专业课程设置,中职学校计算机专业课程设置的几点思考
  11. Beego使用AdminLTE
  12. 用C/C++手撕CPlus语言的集成开发环境(1)—— 语言规范 + 词法分析器
  13. python 包络线_如何简明易懂地说明数据包络线分析法(DEA)?
  14. VMware15Pro 安装CentOS7
  15. 计算平均成绩 (10分)
  16. python3 判断素数
  17. MySQL 数据库 启动 关闭
  18. Win7系统下Microsoft VS2008过期激活方法
  19. Mac安装Tableau Desktop 2019 for Mac中文版安装教程
  20. 在数据库插入大量不同数据

热门文章

  1. AXI总线学习-------从零开始详细学-------------连载(6)读写处理架构,burst介绍,burst细节定义(burst size burst length)
  2. ancestor descendant选择器
  3. java opennlp_在java中使用opennlp提取名词短语
  4. win10 u盘 修复计算机,怎么用u盘修复windows10专业版系统
  5. 002--YAML工具
  6. 世界著名的四大检索工具
  7. HP ProOne G2 20-in 一体机开后盖换电池记事
  8. 英雄联盟登陆服务器显示外文,英雄联盟手游进不去出现英文怎么办 进不去出现英文解决方法[多图]...
  9. CodeForces - 1169D : Neko Performs Cat Furrier Transform(思维)
  10. python数据结构题目_python数据结构_递归python数据结构_python数据结构 面试题 - 云+社区 - 腾讯云...