java liveness_并发 - 活跃度(Liveness) - 《Java 编程要点(Essential Java)》 - 书栈网 · BookStack...
活跃度(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...相关推荐
- java如何快速抛出异常,异常 - 如何抛出异常 - 《Java 编程要点(Essential Java)》 - 书栈网 · BookStack...
如何抛出异常 在你可以捕获异常之前,一些代码必须抛出一个异常.任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码.无论是什么引发的异常,它总是 ...
- java编译器jdk版本_以编程方式确定Java类的JDK编译版本
java编译器jdk版本 当需要确定使用哪个JDK版本来编译特定的Java .class文件时, 通常使用的方法是使用javap并在javap输出中查找列出的"主要版本". 我在我 ...
- Java高并发与多线程网络编程
目录 一. 基础 1. 线程介绍 2. 创建并启动线程 3. 函数式接口编程 4. Thread 构造器 5. 守护线程 线程关系 6. join 7. interrupt 8. 优雅的结束线程 9. ...
- java高并发解决方案_长文慎入-探索Java并发编程与高并发解决方案
所有示例代码,请见/下载于 1 基本概念 1.1 并发 同时拥有两个或者多个线程,如果程序在单核处理器上运行多个线程将交替地换入或者换出内存,这些线程是同时"存在"的,每个线程都处 ...
- java web 进程通信_RMI网络编程开发之一 JAVA“进程间”通信方式
注意该标题是 "进程"间通信,而并非"线程"之间的通信. 线程之间的通信是多线程的讨论范畴.这里我们是要讨论分布式的独立的JAVA程序之间是怎么通信的.当然,大 ...
- c语言 python java css,从零起步学编程 Python篇 Java篇 C#篇 CSS篇 全4册
内容介绍 本书共四册,从零起步介绍关于Python.Java.C#.CSS这四种常用编程语言的基础知识和实践技巧.作者将以浅显易懂的方式来讲解看似复杂的概念,并通过精选项目来阐述相关问题,进而使你更加 ...
- java gui的文本框_GUI编程笔记(java)07:GUI把文本框的值移到文本域案例
1.首先我们了解一下我们的需求,如下: 输入"风清扬",点击"数据转移",这样的文本会出现到下面的文本域中,这就是我们的需求. 2.代码如下: package ...
- linux下java调用python脚本,java - 在Linux Terminal中以编程方式从Java调用python脚本 - 堆栈内存溢出...
我正在开发一个Java应用程序,用于检查源文件中的补丁程序(是否存在). 用于检测补丁程序更改的核心逻辑位于python脚本[titled'patch.py']中,并且我的Java应用程序与此Py ...
- java 多线程 并发 面试题_最常见的15个Java多线程,并发面试问题
假设你有三个线程T1,T2,T3.你如何能保证线程T2在线程T1后运行,T3在T2后运行 这个线程面试问题大多是在第一轮或电话筛选轮次中会被问到的,这个多线程问题的目的是检查候选人对"joi ...
- 青岛互联网java开发_为什么说Java是过去未来的互联网编程(上)
为什么说Java是过去未来的互联网编程之王,学习java做一个java工程师不但待遇高,而且前途无可限量.为什么这样说呢? Java对你而言是什么?一门你大学里学过的语言?一个IT行业的通用语言?你相 ...
最新文章
- Lucene.net中文分词探究
- python读取大文件-python读取大文件
- QT练习9 Dialog学习
- mac电脑快捷键(持续更新)
- 80%的Oracle JDK用户正在寻找免费的替代品!!!
- XZ_iOS iOS13浅色模式/暗黑模式导航栏颜色不自动适配
- 纯干货 | 从淘宝到云端的高可用架构演进
- deepin安装nginx服务器
- 数据库课程设计:医院信息管理系统(pycharm+MySQL)
- 前端学习-----HTML
- HTML5期末大作业dreamweaver作业静态HTML网页设计——甜点店(11页) 学生网页设计作品
- Scrapy-Redis使用教程将现有爬虫修改为分布式爬虫
- 亚古兽的进化之路——从Model_Builder,工具箱到python工具箱
- 关于ZETag云标签你了解多少?
- 中文字体设置fontFamily无效
- 音视频基础:音频(PCM和AAC)
- 【短视频 】 分享几个免费剪辑视频的软件
- 好用的电视盒子软件推荐:无广告看电视我选这两款
- 浅析25/50/100GE高速网络损伤仪的技术诉求
- (转载)你好,C++(6)2.3 C++兵器谱
热门文章
- linux aufs,UnionFS有什么用?AUFS的一些特性
- Cyclone IV系列FPGA串口远程烧写详解
- 基于STM32MP157调试MIPI-DSI屏幕
- 印度网民集体删除中国APP,网友评论亮了
- 单片机 嵌入式 毕业设计题目选题推荐
- 私有云的优缺点_私有云的优缺点是什么?与公有云的区别
- 谷歌大脑创始成员辞职,他也和Jeff Dean闹掰了
- 英雄联盟3月17日服务器维护,英雄联盟将于3月17日凌晨2点开始进行全区停机维护...
- David Time Capsule Kick Off
- Swift游戏实战-跑酷熊猫 08 产生源源不断的移动平台