Active Object并发模式在Java中的应用

简介:Active Object 是并发编程实践中典型的设计模式,Active Object 模式的核心是通过解耦合 方法的调用与执行来提高程序的并发度。本文将从典型 Active Object 设计模式入手,从一个新的视角 来探讨 Active Object 并发模式在 Java 中的应用。

本文主要从以下两个方面进行阐述:

使用 C++ 语言,来描述 Active Object 设计模式。

Java 类库对于这样一个典型的模式做了很好的类库层面的封装,因此对于 Java 的开发者来说,很多 关于该设计模式本身的东西被屏蔽掉了。本文试图使用 Native C++ 语言,帮助读者从本质上对 Active Object 设计模式有一个更全面的认识。

结合 C++ 版本的 Active Object 设计模式,引领读者对于 Active Object 设计模式在 Java 类库中 的支持,有一个更深刻的认识,帮助读者正确并且有效地使用这些类库。

预备知识

并发对象 (Concurrent Object)

在这里,我们先定义一下,什么是并发对象。不同于一般的对象,并发对象指的是该对象方法的调用 与方法的执行不在同一个线程內,也即:该对象方法被异步执行。这其实是在多线程编程环境下典型的计 算特征,线程引入了异步。从另一个角度来看,并发对象其实是面向对象的概念应用于多线程计算环境下 的产物。

Active Object 设计模式 C++ 描述

我们将从以下几个方面来讨论 Active Object 模式。

问题描述

我们都知道,基于多线程机制的并发编程模式可以极大提高应用的 QoS(Quality of Service)。典型 的例子如,我们在开发服务器端的应用时,通行的做法就是通过多线程机制并发地服务客户端提交上来的 请求,以期提高服务器对客户端的反应度 (Responsiveness)。同时,相比于单线程的应用,并发的多线 程应用相对要复杂得多。在多线程的计算环境里,并发对象被所有的调用者线程所共享。一般来说,并发 对象的设计实现需要考虑下面的几个重要因素:

并发对象的任何一次的方法执行,不允许无限地或者长时间阻止其它方法的调用执行,从而影响应用 的 QoS。

由于并发对象被调用者线程所共享,其内部状态必须保证是线程安全的,必须受限于某些线程同步约 束,并且这些约束对调用者来说是透明的,不可见的。从调用者的角度来看,并发对象与普通对象没有多 大区别。

并发对象的设计实现,应该能够透明地利用底层平台所提供的并发机制。这样做的好处是,当并发对 象运行在诸如多核处理器这类底层硬件平台上时,我们的应用能够充分挖掘底层平台带来的并发优势,以 获得足够好的应用性能。

我们使用 Active Object 设计模式来解决这些问题。

Active Object 设计模式的本质是解耦合方法的调用 (Method invocation) 与方法的执行 (Method execution),方法调用发生在调用者线程上下文中,而方法的执行发生在独立于调用者线程的 Active Object 线程上下文中。并且重要的一点是,该方法与其它普通的对象成员方法对于调用者来说,没有什 么特别的不同。从运行时的角度来看,这里涉及到两类线程,一个是调用者线程,另外一个是 Active Object 线程,我们会在下面更详细地谈到。

时间: 2024-10-29 10:28:54

Active Object并发模式在Java中的应用的相关文章

JAVA中的观察者模式实例教程

观察者模式是一种行为设计模式.观察者模式的用途是,当你对一个对象的状态感兴趣,希望在它每次发生变化时获得通知.在观察者模式中,观察另外一个对象状态的对象叫做Observer观察者,被观察的对象叫着Subject被观察者.根据GoF规则,观察者模式的意图是: 定义对象之间一对多的依赖关系,一个对象状态改变,其他相关联的对象就会得到通知并被自动更新. Subject(被观察者)包含了一些需要在其状态改变时通知的观察者.因此,他应该提供给观察者可以register(注册)自己和unregister(注

Java中的观察者模式实例讲解_java

观察者模式是一种行为设计模式.观察者模式的用途是,当你对一个对象的状态感兴趣,希望在它每次发生变化时获得通知.在观察者模式中,观察另外一个对象状态的对象叫做Observer观察者,被观察的对象叫着Subject被观察者.根据GoF规则,观察者模式的意图是: 复制代码 代码如下: 定义对象之间一对多的依赖关系,一个对象状态改变,其他相关联的对象就会得到通知并被自动更新. Subject(被观察者)包含了一些需要在其状态改变时通知的观察者.因此,他应该提供给观察者可以register(注册)自己和u

基于java中反射的总结分析_java

刚开始学习java的时候真的很难理解反射到底是个什么东西 一些书籍,哪怕是很经典的书籍都解释的让人感觉懵懵的,或许的确是我太笨 况且,网上说在将来学习框架的时候需要经常应用到反射机制,这样一来总让人心里有些不安 就方才偶然又把讲解反射的章节和视频看了一点,觉得能理解一些了 现在决定一鼓作气,边看边写,顺便把一些主要的内容和操作都记载到这里 我想,对于我这么一个笨笨的人来说,学习的最好方法也许就是不断重复 遇到不懂的知识就停下来把以往的重新学一遍,虽然浪费了很多时间,但对我也有些效果   我的理解

详解Java中的指针、引用及对象的clone

对象|详解 Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象.本文会让你了解什么是影子clone与深度clone,认识它们的区别.优点及缺点.看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的

Java 中Comparable 和 Comparator的比较

本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示例,对它们的使用方法进行说明. Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着"该类支持排序".  即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(或数组)",则该List列表(或数组)可以通过 Collections.sort(或 Array

理解java中的深复制和浅复制_java

 Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象.本文会让你了解什么是影子clone与深度clone,认识它们的区别.优点及缺点.       看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写

对比Java中的Comparable排序接口和Comparator比较器接口_java

ComparableComparable 是排序接口. 若一个类实现了Comparable接口,就意味着"该类支持排序". 即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(或数组)",则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序. 此外,"实现Comparable接口的类的对象"可以用作"有序映射(如TreeM

java中对象的浅复制和深复制笔记

在面向对象的语言中,如Java/Python,对象的复制有两种形式:浅复制和深复制 一.浅复制    浅复制只是将原对象的引用备份了一份给新的变量,实际两者指向的是同一个对象.在Python中,字典.列表.元祖等都是对象类型 >>> person=['name',['savings',100.00]] >>> hubby=person[:] >>> wifely=list(person) >>> [id(x) for x in per

Java 中Comparable和Comparator区别比较_java

Comparable 简介Comparable 是排序接口.若一个类实现了Comparable接口,就意味着"该类支持排序".  即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(或数组)",则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序.此外,"实现Comparable接口的类的对象"可以用作"有序映射(如Tre