活跃度(Liveness)

一个并行应用程序的及时执行能力被称为它的活跃度(liveness)。本节将介绍最常见的一种活跃度的问题——死锁,以及另外两个活跃度的问题——饥饿和活锁。

死锁(Deadlock)

死锁是指两个或两个以上的线程永远被阻塞,一直等待对方的资源。

下面是一个例子。

Alphonse 和 Gaston 是朋友,都很有礼貌。礼貌的一个严格的规则是,当你给一个朋友鞠躬时,你必须保持鞠躬,直到你的朋友鞠躬回给你。不幸的是,这条规则有个缺陷,那就是如果两个朋友同一时间向对方鞠躬,那就永远不会完了。这个示例应用程序中,死锁模型是这样的:

publicclassDeadlock{

staticclassFriend{

privatefinalStringname;

publicFriend(Stringname){

this.name=name;

}

publicStringgetName(){

returnthis.name;

}

publicsynchronizedvoidbow(Friendbower){

System.out.format("%s: %s"+" has bowed to me!%n",this.name,bower.getName());

bower.bowBack(this);

}

publicsynchronizedvoidbowBack(Friendbower){

System.out.format("%s: %s"+" has bowed back to me!%n",this.name,bower.getName());

}

}

publicstaticvoidmain(String[]args){

finalFriendalphonse=newFriend("Alphonse");

finalFriendgaston=newFriend("Gaston");

newThread(newRunnable(){

publicvoidrun(){

alphonse.bow(gaston);

}

}).start();

newThread(newRunnable(){

publicvoidrun(){

gaston.bow(alphonse);

}

}).start();

}

}

当他们尝试调用 bowBack 两个线程将被阻塞。无论是哪个线程永远不会结束,因为每个线程都在等待对方鞠躬。这就是死锁了。

饥饿和活锁(Starvation and Livelock)

饥饿和活锁虽比死锁问题稍微不常见点,但这些是在并发软件种每一个设计师仍然可能会遇到的问题。

饥饿(Starvation)

饥饿描述了这样一个情况,一个线程不能获得定期访问共享资源,于是无法继续执行。这种情况一般出现在共享资源被某些“贪婪”线程占用,而导致资源长时间不被其他线程可用。例如,假设一个对象提供一个同步的方法,往往需要很长时间返回。如果一个线程频繁调用该方法,其他线程若也需要频繁的同步访问同一个对象通常会被阻塞。

活锁(Livelock)

一个线程常常处于响应另一个线程的动作,如果其他线程也常常处于该线程的动作,那么就可能出现活锁。与死锁、活锁的线程一样,程序无法进一步执行。然而,线程是不会阻塞的,他们只是会忙于应对彼此的恢复工作。现实种的例子是,两人面对面试图通过一条走廊: Alphonse 移动到他的左则让路给 Gaston ,而 Gaston 移动到他的右侧想让 Alphonse 过去,两个人同时让路,但其实两人都挡住了对方没办法过去,他们仍然彼此阻塞。

java liveness_并发 - 活跃度(Liveness) - 《Java 编程要点(Essential Java)》 - 书栈网 · BookStack...相关推荐

  1. java如何快速抛出异常,异常 - 如何抛出异常 - 《Java 编程要点(Essential Java)》 - 书栈网 · BookStack...

    如何抛出异常 在你可以捕获异常之前,一些代码必须抛出一个异常.任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码.无论是什么引发的异常,它总是 ...

  2. java编译器jdk版本_以编程方式确定Java类的JDK编译版本

    java编译器jdk版本 当需要确定使用哪个JDK版本来编译特定的Java .class文件时, 通常使用的方法是使用javap并在javap输出中查找列出的"主要版本". 我在我 ...

  3. Java高并发与多线程网络编程

    目录 一. 基础 1. 线程介绍 2. 创建并启动线程 3. 函数式接口编程 4. Thread 构造器 5. 守护线程 线程关系 6. join 7. interrupt 8. 优雅的结束线程 9. ...

  4. java高并发解决方案_长文慎入-探索Java并发编程与高并发解决方案

    所有示例代码,请见/下载于 1 基本概念 1.1 并发 同时拥有两个或者多个线程,如果程序在单核处理器上运行多个线程将交替地换入或者换出内存,这些线程是同时"存在"的,每个线程都处 ...

  5. java web 进程通信_RMI网络编程开发之一 JAVA“进程间”通信方式

    注意该标题是 "进程"间通信,而并非"线程"之间的通信. 线程之间的通信是多线程的讨论范畴.这里我们是要讨论分布式的独立的JAVA程序之间是怎么通信的.当然,大 ...

  6. c语言 python java css,从零起步学编程 Python篇 Java篇 C#篇 CSS篇 全4册

    内容介绍 本书共四册,从零起步介绍关于Python.Java.C#.CSS这四种常用编程语言的基础知识和实践技巧.作者将以浅显易懂的方式来讲解看似复杂的概念,并通过精选项目来阐述相关问题,进而使你更加 ...

  7. java gui的文本框_GUI编程笔记(java)07:GUI把文本框的值移到文本域案例

    1.首先我们了解一下我们的需求,如下: 输入"风清扬",点击"数据转移",这样的文本会出现到下面的文本域中,这就是我们的需求. 2.代码如下: package ...

  8. linux下java调用python脚本,java - 在Linux Terminal中以编程方式从Java调用python脚本 - 堆栈内存溢出...

    我正在开发一个Java应用程序,用于检查源文件中的补丁程序(是否存在). 用于检测补丁程序更改的核心逻辑位于python脚本[titled'patch.py​​']中,并且我的Java应用程序与此Py ...

  9. java 多线程 并发 面试题_最常见的15个Java多线程,并发面试问题

    假设你有三个线程T1,T2,T3.你如何能保证线程T2在线程T1后运行,T3在T2后运行 这个线程面试问题大多是在第一轮或电话筛选轮次中会被问到的,这个多线程问题的目的是检查候选人对"joi ...

  10. 青岛互联网java开发_为什么说Java是过去未来的互联网编程(上)

    为什么说Java是过去未来的互联网编程之王,学习java做一个java工程师不但待遇高,而且前途无可限量.为什么这样说呢? Java对你而言是什么?一门你大学里学过的语言?一个IT行业的通用语言?你相 ...

最新文章

  1. Lucene.net中文分词探究
  2. python读取大文件-python读取大文件
  3. QT练习9 Dialog学习
  4. mac电脑快捷键(持续更新)
  5. 80%的Oracle JDK用户正在寻找免费的替代品!!!
  6. XZ_iOS iOS13浅色模式/暗黑模式导航栏颜色不自动适配
  7. 纯干货 | 从淘宝到云端的高可用架构演进
  8. deepin安装nginx服务器
  9. 数据库课程设计:医院信息管理系统(pycharm+MySQL)
  10. 前端学习-----HTML
  11. HTML5期末大作业dreamweaver作业静态HTML网页设计——甜点店(11页) 学生网页设计作品
  12. Scrapy-Redis使用教程将现有爬虫修改为分布式爬虫
  13. 亚古兽的进化之路——从Model_Builder,工具箱到python工具箱
  14. 关于ZETag云标签你了解多少?
  15. 中文字体设置fontFamily无效
  16. 音视频基础:音频(PCM和AAC)
  17. 【短视频 】 分享几个免费剪辑视频的软件
  18. 好用的电视盒子软件推荐:无广告看电视我选这两款
  19. 浅析25/50/100GE高速网络损伤仪的技术诉求
  20. (转载)你好,C++(6)2.3 C++兵器谱

热门文章

  1. linux aufs,UnionFS有什么用?AUFS的一些特性
  2. Cyclone IV系列FPGA串口远程烧写详解
  3. 基于STM32MP157调试MIPI-DSI屏幕
  4. 印度网民集体删除中国APP,网友评论亮了
  5. 单片机 嵌入式 毕业设计题目选题推荐
  6. 私有云的优缺点_私有云的优缺点是什么?与公有云的区别
  7. 谷歌大脑创始成员辞职,他也和Jeff Dean闹掰了
  8. 英雄联盟3月17日服务器维护,英雄联盟将于3月17日凌晨2点开始进行全区停机维护...
  9. David Time Capsule Kick Off
  10. Swift游戏实战-跑酷熊猫 08 产生源源不断的移动平台