AKKA文档2.2(java)——术语,概念

原文:http://doc.akka.io/docs/akka/2.3.6/general/terminology.html 译者:吴京润

本章我们试图建立一个通用的术语列表,用来定义有关并发和分布式系统的坚实的基础,而这也是akka的目标。请注意,在这些术语当中许多并没有一致的定义。我们简单的寻求在akka文档范围内使用的工作定义。

并发与并行

并发与并行是相关的概念,但是也有很多细节上的差异。并发意味着两个或更多的任务正在取得进展,即使它们不是同时执行的。例如,可以用时间片的方式实现这一点,每个任务在时间片内执行一小部分,并与其它任务的切片混合执行。并行的出现使任务实现了真正的同时执行。

异步与同步

如果方法的调用者在方法返回或抛出异常前不能有任何进展,这个方法调用就被认为是同步的。然而异步调用允许调用者可以取得有限的进展,调用的方法完成时会通过其它机制(可能是注册的回调、Future对象或一条消息)向调用者发送信号。

一个同步API可能使用阻塞方式实现,但这不是必须的。对于一个CPU密集型任务可能有类似的阻塞行为。一般情况下,异步API是更好的选择,因为它们确保任务可以取得进展。角色是天生异步的,一个角色能够在发送一条消息后不用等待实际的传输行为而继续执行。

非阻塞与阻塞

我们谈论的阻塞是指一个线程的延迟可以无限期延迟其它一些线程。一个不错的例子是一个线程以互斥的方式独占一项资源。如果一个线程无限期的(比如不小心运行了一个无限循环)持有这项资源,而其它线程因等待该资源而无法继续运行。与此相反,非阻塞意味着没有线程可以无限期的延迟其它线程。

非阻塞操作比阻塞操作要优先选择,当系统中包含阻塞操作时,系统整体的进度就不能得到一般性的保证。

死锁、饥饿与活锁

死锁的出现是因为多个参与者同时互相等待对方到达某个特定状态进而得以继续,然而它们都因为其它参与者不能到达这个特定状态(一个“第二十二条军规”问题)而不能继续,所有相关子系统都不能被中断。死锁与阻塞紧密相关,因为一个参与者线程有能够无限期延迟其它线程的必要。

发生了死锁时,没有参数者可以继续执行,而饥饿恰好与之相反,当有参与者可以执行时,可能会有一个或更多得不到执行机会。典型场景是一个简单调度算法问题挑选高优先级任务。如果持续传入足够多的高优先级任务,低优先级任务永远也不会执行。

活锁类似死锁,没有参与者可以继续执行。所不同的是,不是在等待其它参与者的进度,而是参与者自己不断改变自己的状态。一个示例场景是两个参与者有两个相同的可用资源。它们都试图获得资源,但是它们还会检查是否有其它参与者也需要这个资源。当资源被其它参与者请求时,它们尝试得到这个资源的其它实例。在不走运的时候,可能会发生两个竞争者在两个资源之间反弹,永远也不占有它们,一直迁就于其它参与者。

竞态条件

我们说的竞态条件是指有关一组事件的顺序的假设可能会受外部不确定性因素的影响。竞态条件经常发生在多线程拥有一个共享可变状态,而线程交替操作引发的意外行为。虽然这是一种常见情况,共享状态也不必出现竞态条件。一个例子是,客户端向服务器发送无序数据包(UDP数据报就是这样的例子) P1P2。数据包可能经由不同的网络路径,服务器可能先收到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

来源于:http://ifeve.com/akka-doc-java-terminology-concepts/

原文地址:https://www.cnblogs.com/JonaLin/p/11548130.html

时间: 2024-09-30 05:15:08

AKKA文档2.2(java)——术语,概念的相关文章

AKKA文档(java版)

目前我正在翻译AKKA官网文档.翻译:吴京润 译者注:本人正在翻译AKKA官网文档,本篇是文档第一章,欢迎有兴趣的同学加入一起翻译.更多内容请读这里:https://tower.im/projects/ac49db18a6a24ae4b340a5fa22d930dc/lists/ded96c34f7ce4a6bb8b5473f596e1008/show/https://tower.im/projects/ac49db18a6a24ae4b340a5fa22d930dc/todos/640e53d

浅析如何将XML文档解析成java对象(待梳理)

User类 public class User implements Serializable { private static final long serialVersionUID = 7506854293380407436L; private Integer id; private String loginName; private String password; private Date createDate; private String username; public User(

AKKA文档(java版)—角色

角色 角色模型对编写并发.分布式系统进行了高度抽象.它减轻了开发者必须对互斥锁与线程管理的负担,更容易编写出正确的并发与并行系统.早在1973 年 Carl Hewitt 发表的论文中定义了角色,但一直流行于Erlang 语言中,随后被爱立信公司应用于建立高并发.可靠通信系统,取得了巨大成功. Akka 框架里面角色的API 跟Scala 框架里面角色相似,后者一些语法曾经模仿Erlang语言. 创建角色 注意:由于Akka强迫父级监管者监督每一个角色和(潜在的子级)监管者,建议你熟悉角色系统.

Laravel(PHP)使用Swagger生成API文档不完全指南 - 基本概念和环境搭建 - 简书

在PHPer中,很多人听说过Swagger,部分人知道Swagger是用来做API文档的,然而只有少数人真正知道怎么正确使用Swagger,因为PHP界和Swagger相关的资料实在是太少了.所以鄙人斗胆一试,希望能以本文帮助到大家了解Swagger,从此告别成天用Word.Markdown折腾API文档的日子. 什么是Swagger Swagger is a simple yet powerful representation of your RESTful API. With the lar

Ext JS 6学习文档–第2章–核心概念

核心概念 在下一章我们会构建一个示例项目,而在这之前,你需要学习一些在 Ext JS 中的核心概念,这有助于你更容易理解示例项目.这一章我们将学习以下知识点: 类系统,创建和扩展类 事件 Ext JS 对象的查询 容器 布局 转载请注明出处:http://www.jeeboot.com/archives/1217.html class system(类系统) Ext JS 提供了很多功能,使得它创建和处理类变得简单.以下是在 Ext JS 6 的类系统中的几大组成类: Ext Base Clas

storm文档(7)----基本概念

转载请注明出处:http://blog.csdn.net/beitiandijun/article/details/41546195 源地址:http://storm.apache.org/documentation/Concepts.html 本文介绍了storm的主要概念,并且给出相关链接供你查看更多信息.本文讨论的概念如下所示: 1.Topologies 2.Streams 3.Spouts 4.Bolts 5.Stream Grouping 6.Reliability 7.Tasks 8

CAA 帮助文档html中Java搜索程序不能运行

主要原因是由于当前的Java 版本太高造成的,需要卸载掉高版本Java之后,再安装Jre1.6版本. 安装完成之后需要检查环境变量: 1)JAVA_HOME  C:\Program Files (x86)\Java\jdk1.6.0_02 2) Path 中加入%JAVA_HOME%\lib;%JAVA_HOME%\bin; 但是我在安装完这一切之后,还是不能运行.再检查IE的加载选项,打开IE的"管理加载项"窗口后,发现"Sun Java Console"被禁用了

unittest的文档4个重要的概念.py

"""1.Test Case一个TestCase的实例就是一个测试用例.什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp).实现测试过程的代码(run),以及测试后环境的还原(tearDown).单元测试(unit test)的本质也就在这里,一个测试用例就是一个完整的测试单元,通过运行这个测试单元,可以对某一个功能进行验证.2.Test Suite一个功能的验证往往需要多个测试用例,可以把多个测试用例集合在一起来执行,这就产生了测试套件Test

XML概念,约束文档,解析

day01总结 今日内容 l XML语法 l XML约束之DTD l XML解析器介绍 l XML解析之JAXP( DOM.SAX ) l DOM4J l Schema 一.XML语法 XML概述 1 什么是XML XML全称为Extensible Markup Language, 意思是可扩展的标记语言,它是 SGML(标准通用标记语言)的一个子集. XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的. W3C在1998年2月发布1.0版本: W3C