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

下面是两种较新的基于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. NET Core全新的开发体验

    NET Core全新的开发体验 2016年6月27日,这是一个特殊的日子,微软全新的.NET开发平台.NET Core的RTM版本正式发布.我个人将.NET Core的核心特性归结为三点,它们的首字母 ...

  2. jsp字段判空

    是对象吧String jsp的写法 <% if(str == null) { %> str is null <% } else { %> str not null <% ...

  3. 多线程之线程通信条件Condition

    Condition是Locks锁下的还有一种线程通信之间唤醒.堵塞的实现.它以下的await,和signal可以实现Object下的wait,notify和notifyAll的所有功能,除此之外改监视 ...

  4. Win7 和 MAC 系统通过VMware共享文件夹(简单又好用,几乎什么都不用设置)

    Win7是Server,Mac是Client,VMware上运行Mac系统 1.在VMware的Options菜单中选择Shared Folders选项 2.选择Always enabled选项 3. ...

  5. Maven和Eclipse联合开发(转)

    最近公司突然把以前的架构推到从来,这个还真需要勇气,不过也是的,基础不好,再好的房子也站不稳.公司采用Maven作为项目管理,WebService项目框架采用SDHI.(Spring+Dubbo+He ...

  6. 《Python简明教程》总结

    Python经典教程<Python简明教程> 目录: 为什么Python 安装Python 体验Python Python数据类型 运算符与表达式 控制流 函数 模块 数据结构 解决问题 ...

  7. [Boost]boost的时间和日期处理-(2)时间的操作

    <开篇> 本篇紧接着boost上篇叙述Boost::DateTime的时间处理.在C++中,常见的时间有time_t, FILETIME和tm,而boost中用ptime. 构造ptime ...

  8. window下svn注册为本地的服务

    sc create svnservice binpath= "\"C:\program files\Subversion\bin\svnserve.exe\" --ser ...

  9. Objective-C基础笔记(5)Protocol

    Protocol简单来说就是一系列方法的列表,当中声明的方法能够被不论什么类实现.这中模式一般称为代理(delegation)模式. 在IOS和OS X开发中,Apple採用了大量的代理模式来实现MV ...

  10. linux下编译.so 和.a 可能出现的问题 ?

    1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持 ...