在并发的世界里,选择合适的状态处理方法将对并发性和正确性起到决定性的影响。这方面可选的方法有:共享可变性、隔离可变性以及完全不可变性。
对于并发问题来说最好的解决方法是从根本上消灭它而不是花很多时间解决它。要做到这一点其实很简单,只要消除可变状态就可以了,即我们要围绕不可变性或至少是隔离可变性来设计应用程序。

下面是两种较新的基于JVM虚拟机开发语言Clojure,Scala,Groovy等的解决方案

1.软件事务内存STM(Software Transaction Memory)

STM是针对共享可变性问题的一次大胆尝试,其核心思路是将可变实体从不可变状态值中分离出来。STM是经由Clojure成功实践之后才逐渐流行起来的。在Clojure语言中,状态是不可变的,而托管实体仅在STM的事务控制范围是可变的。这种做法不仅可以使可变实体的行为具备可预测性和确定性,同时还提供了一种显式的锁无关的编程方法。

然而STM存在两个主要缺陷。其一,如果项目所使用的编程语言不是Clojure,那么必须格外小心,以确保锁处理的状态除了托管实体都是不可变的,而这一问题对于JVM上的绝大多数语言都同样存在。其二,必须确保事务的实现代码都是幂等的且无任何副作用。

也正是由于这个原因,STM更适用于写冲突不频繁的应用场景。因为在冲突不频繁的情况下自动重做的策略是OK的,而在某些极端情况下该策略可能会导致严重的性能问题。总而言之,只要我们能够小心谨慎地处理托管的共享可变性,STM也能够实现理想的并发度。但是在没有底层语言支持的情况下,我们要达到这一目标的代价会比用Clojure实现大很多。

2.基于角色的模型

通过将隔离可变性的思想发扬光大,该模型从根本上消除了同步问题。其主要特点为:每个角色均各自独立运行,相互之间依靠高效的异步消息进行通信,并保证同时到达的消息通过排队的方式逐个处理。

该模型的主要问题是,包括读操作在内的并发任务之间的所有通信都是通过消息来完成的。所以那些需要获得完全一致的状态值的读操作就不得不交叉地发送请求以相互印证。使用多角色协作来设计应用程序的方法与设计一个OO应用程序的方法是有很大区别的。

在基于角色的模型中,不但要确保消息是不可变的,并且为了使其能够独立完成关键任务,对角色的定义也都是相当的粗粒度的。此外,应当注意不要将角色们之间的交互设计得过于繁复,以避免角色们都将时间消费在相互等待上而无法处理手头堆积的问题。

总而言之,选择并发模型并未将我们强行捆绑到特定的语言上。模型的选择是由应用程序的特性、我们使用的设计方法以及团队进行自我调整以适应新模型的意愿共同决定的。

基于JVM规范的并发编程解决方案的更多相关文章

  1. (4)socket的基础使用(基于TCP协议的并发编程)

    需要实现并发需要依靠socketserver 模块 socketserver模块下有几个功能 def __init__(self, request, client_address, server): ...

  2. 并发编程 01—— ThreadLocal

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  3. 并发编程 05—— Callable和Future

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  4. 并发编程 17—— Lock

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  5. [CSAPP笔记][第十二章并发编程]

    第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...

  6. 并发编程 20—— AbstractQueuedSynchronizer 深入分析

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  7. 并发编程 02—— ConcurrentHashMap

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  8. 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  9. 并发编程 06—— CompletionService :Executor 和 BlockingQueue

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

随机推荐

  1. POJ 3675 Telescope 简单多边形和圆的面积交

    这道题得控制好精度,不然会贡献WA  QAQ 还是那个规则: int sgn(double x){ if(x > eps) return 1; else if(x < - eps) ret ...

  2. WEB开发:如何用js来模拟服务器的ajax响应,不依赖服务器来编写前端代码

    一.问题的提出 目前web前端开发,主流的思路是: 1)编写静态的html文件(不使用模板技术,与服务器无关) 2)页面通过ajax与服务器交互,进行数据的传输,数据格式为json格式 这里存在一个问 ...

  3. python idle 错误 subprocess didn&#39;t make connection

    今天打开python idle不反应.然后通过网上搜索让我在安装文件夹下点击idle.py 弹出如图所看到的的错误,进行了非常多尝试.任然没有得到解决.可是在尝试过程中发现了大家所说问题所在都是由于新 ...

  4. JSU省赛队员选拔赛个人赛1(Coin Change、Fibbonacci Number、Max Num、单词数、无限的路、叠筐)

    JSU省赛队员选拔赛个人赛1 一.题目概述: A.Coin Change(暴力求解.动态规划)     B.Fibbonacci Number(递推求解) C.Max Num(排序.比较) D.单词数 ...

  5. C# 仿金山毒霸启动和关闭淡入淡出效果

    原文 C# 仿金山毒霸启动和关闭淡入淡出效果 01 #region 窗体关闭效果 02   03 #region 私有方法 04 [DllImportAttribute("user32.dl ...

  6. 使用数组实现队列----《数据结构与算法分析---C语言描述》

    一.h文件:my_que.h #ifndef _MY_QUE_H_ #define _MY_QUE_H_ struct QueRecord; typedef struct QueRecord* que ...

  7. 异常configure: *** apu library not found.

    安装modsecurity时,出现"configure: *** apu library not found.".      解决方法: yum install apr-util- ...

  8. 一张图说清Asp.NET MVC中的 RenderPage、RenderBody、RenderSection

  9. .cmd文件与.bat文件

    .cmd文件与.bat文件的区别 包括ASSOC.FTYPE.APPEND.PATH.PROMPT.SET等6个命令在.bat和命令行环境下与.cmd环境下的执行表现不尽相同在.cmd环境下这些命令无 ...

  10. UML04-顺序图

    1.顺序图由哪几部分组成? 2.下面列出了打印文件时的工作流: 用户通过计算机指定要打印的文件. 打印服务器根据打印机是否空闲,操作打印机打印文件. 如果打印机空闲,则打印机打印文件: 如果打印机忙, ...