AKKA文档2.2(java)——术语,概念
原文:http://doc.akka.io/docs/akka/2.3.6/general/terminology.html 译者:吴京润
本章我们试图建立一个通用的术语列表,用来定义有关并发和分布式系统的坚实的基础,而这也是akka的目标。请注意,在这些术语当中许多并没有一致的定义。我们简单的寻求在akka文档范围内使用的工作定义。
并发与并行
并发与并行是相关的概念,但是也有很多细节上的差异。并发意味着两个或更多的任务正在取得进展,即使它们不是同时执行的。例如,可以用时间片的方式实现这一点,每个任务在时间片内执行一小部分,并与其它任务的切片混合执行。并行的出现使任务实现了真正的同时执行。
异步与同步
如果方法的调用者在方法返回或抛出异常前不能有任何进展,这个方法调用就被认为是同步的。然而异步调用允许调用者可以取得有限的进展,调用的方法完成时会通过其它机制(可能是注册的回调、Future对象或一条消息)向调用者发送信号。
一个同步API可能使用阻塞方式实现,但这不是必须的。对于一个CPU密集型任务可能有类似的阻塞行为。一般情况下,异步API是更好的选择,因为它们确保任务可以取得进展。角色是天生异步的,一个角色能够在发送一条消息后不用等待实际的传输行为而继续执行。
非阻塞与阻塞
我们谈论的阻塞是指一个线程的延迟可以无限期延迟其它一些线程。一个不错的例子是一个线程以互斥的方式独占一项资源。如果一个线程无限期的(比如不小心运行了一个无限循环)持有这项资源,而其它线程因等待该资源而无法继续运行。与此相反,非阻塞意味着没有线程可以无限期的延迟其它线程。
非阻塞操作比阻塞操作要优先选择,当系统中包含阻塞操作时,系统整体的进度就不能得到一般性的保证。
死锁、饥饿与活锁
死锁的出现是因为多个参与者同时互相等待对方到达某个特定状态进而得以继续,然而它们都因为其它参与者不能到达这个特定状态(一个“第二十二条军规”问题)而不能继续,所有相关子系统都不能被中断。死锁与阻塞紧密相关,因为一个参与者线程有能够无限期延迟其它线程的必要。
发生了死锁时,没有参数者可以继续执行,而饥饿恰好与之相反,当有参与者可以执行时,可能会有一个或更多得不到执行机会。典型场景是一个简单调度算法问题挑选高优先级任务。如果持续传入足够多的高优先级任务,低优先级任务永远也不会执行。
活锁类似死锁,没有参与者可以继续执行。所不同的是,不是在等待其它参与者的进度,而是参与者自己不断改变自己的状态。一个示例场景是两个参与者有两个相同的可用资源。它们都试图获得资源,但是它们还会检查是否有其它参与者也需要这个资源。当资源被其它参与者请求时,它们尝试得到这个资源的其它实例。在不走运的时候,可能会发生两个竞争者在两个资源之间反弹,永远也不占有它们,一直迁就于其它参与者。
竞态条件
我们说的竞态条件是指有关一组事件的顺序的假设可能会受外部不确定性因素的影响。竞态条件经常发生在多线程拥有一个共享可变状态,而线程交替操作引发的意外行为。虽然这是一种常见情况,共享状态也不必出现竞态条件。一个例子是,客户端向服务器发送无序数据包(UDP数据报就是这样的例子) P1,P2。数据包可能经由不同的网络路径,服务器可能先收到P2再收到P1。如果消息不包含有关它们的发送顺序的信息,服务器就不能确定数据包的顺序了。依赖于数据包的意义就可能引发竞态条件。
注意
AKKA只保证在一对给定角色之间传递的消息始终保持消息传递的顺序。见消息传递的可靠性。
非阻塞担保(进展状况)
在前面的章节中,因为一些原因而不推荐阻塞,包括死锁的危险,降低系统吞吐量。接下来的部分我们从不同程度上讨论多种非阻塞属性。
无等待
一个无等待的方法是指每次调用确保在有限步骤内结束。如果一个方法是有界无等待的,它的步数就有一个上限。
基于这个定义,无等待方法永远不阻塞,因此也不会死锁,因为每一部分都可以在有限步数以后继续(当调用结束时),无等待方法也不会发生饥饿。
无锁定
无锁定属性比无等待要弱。发生无锁定的调用时,方法常常在有限步骤内完成。这一定义意味着无锁定的调用不会发生死锁。另一方面,确保一些方法在有限步内完成不足以确保所有调用最终都会完成。换句话说,元锁定不足以确保不会发生饥饿。
无阻塞
无阻塞是本文讨论的比无锁定还要弱的保证。一个无阻塞的方法调用是指如果有一个隔离执行的时间点(其它线程不执行任何步骤,比如挂起),它在有限步数内结束。所有无锁定的对象都是无阻塞的,但是反过来通常不成立。
乐观并发控制(OCC)方法通常是无阻塞的。OCC的做法是,每一个参与者试图操作共享对象,但是如果一个参与者探测到与其它参与者冲突,它就回滚所有个性,并按照某些调度策略再次尝试。如果某个时间点上有且只有一个参与者在尝试,操作就会成功。
推荐文献
- 多处理器编程的艺术(The Art of Multiprocessor Programming),M. Herlihy与N Shavit, 2008. ISBN 978-0123705914
- Java并发编程实践(Java Concurrency in Practice),B. Goetz, T. Peierls, J. Bowbeer, D. Holmes与D. Lea. 2006. ISBN 978-0321349606
AKKA文档2.2(java)——术语,概念的更多相关文章
- AKKA文档2.1(java版)——什么是AKKA?
可扩展的实时事务处理 我们相信编写并发.容错.可扩展的应用相当的困难.盖因大多数时候我们一直在使用错误的工具和错误的抽象等级.AKKA就是为了改变这一切的.我们利用角色模型提升了抽象等级,并且提供了一 ...
- Laravel(PHP)使用Swagger生成API文档不完全指南 - 基本概念和环境搭建 - 简书
在PHPer中,很多人听说过Swagger,部分人知道Swagger是用来做API文档的,然而只有少数人真正知道怎么正确使用Swagger,因为PHP界和Swagger相关的资料实在是太少了.所以鄙人 ...
- 不规范的json文档 转化成 java 对象的处理
最近练习爬取数据,遇到了json文档中属性名称没有用双引号的情况,内容如下: 标准的json文档,属性名称都是带双引号的 最后写了个方法,替换属性名字 为 两头追加双引号的属性名字, 特别要注意,防止 ...
- AKKA文档2.3(java版)—什么是角色
原文:http://doc.akka.io/docs/akka/2.3.5/general/actors.html译者:Vitas 什么是角色? 前面角色系统一节介绍了一群角色如何形成一个层次结构,并 ...
- Ext JS 6学习文档–第2章–核心概念
核心概念 在下一章我们会构建一个示例项目,而在这之前,你需要学习一些在 Ext JS 中的核心概念,这有助于你更容易理解示例项目.这一章我们将学习以下知识点: 类系统,创建和扩展类 事件 Ext JS ...
- java操作office和pdf文件java读取word,excel和pdf文档内容
在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...
- 利用Java动态生成 PDF 文档
利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ...
- JAVA文档注释标签
1 常用Java注释标签(Java comment tags) @author 作者 @param 输入参数的名称 说明 @return 输出参数说明 @since JDK版本 @version ...
- [java基础]文档注释
转载自:http://blog.163.com/hui_san/blog/static/5710286720104191100389/ 前言 Java 的语法与 C++ 及为相似,那么,你知道 Jav ...
随机推荐
- 网络摘抄-深入浅出JVM调优
基本概念: JVM把内存区分为堆区(heap).栈区(stack)和方法区(method).由于本文主要讲解JVM调优,因此我们可以简单的理解为,JVM中的堆区中存放的是实际的对象,是需要被GC的.其 ...
- jQuery.getScript(url, [callback])
jQuery.getScript(url, [callback]) 概述 通过 HTTP GET 请求载入并执行一个 JavaScript 文件.大理石平台精度等级 jQuery 1.2 版本之前,g ...
- 用go iris 写的一个网页版文件共享应用(webapp)
主要演示文件拖拽上传或点击上传到不同的目录中,提供下载和删除功能. 目录结构: -main.go --share(用于分类存放上传文件的目录) --v(视图目录) ---share.html main ...
- luoguP1739 表达式括号匹配 x
P1739 表达式括号匹配 题目描述 假设一个表达式有英文字母(小写).运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹 ...
- 如何使用PLX提供的官方驱动和SDK发布自己的产品?
在我的第一篇博文Plx9030通讯卡驱动开发提到,PLX官网提供了丰富的9000系列(9030,9052,9054)芯片的驱动文件(sys)和SDK开发包.我们在发布自己的产品时,简单的话,可以直接用 ...
- Android学习_7/25
常用控件 Android控件使用规律:先定义id,再指定宽度和高度,然后适当加入一些控件特有的属性 1. TextView 在界面上显示一段文本 2. Button ...
- leetcode题目2.两数相加(中等)
题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来 ...
- nginx的请求限制
一.http协议的连接与请求 总结: HTTP请求是建立在一次TCP连接的基础之上. 一次TCP请求至少产生一次HTTP请求. 二.连接限制 limit_conn_module 配置语法: Synta ...
- windows实用cmd命令总结
D: 进入D盘 cd D:\eclipse 进入D盘后进入D盘下的某个路径 Ipconfig 查看计算机ip Cls 清空命令行 ping ip(主机名) 测试网络是否畅通 Help 查看所有的d ...
- linux常用关机和重启命令
Linux有如下的关机和重启命令:shutdown, reboot, halt, poweroff,那么它们有什么区别呢? shutdown - 建议使用的命令 shutdown是最常用也是最安全的关 ...