基于JVM规范的并发编程解决方案
在并发的世界里,选择合适的状态处理方法将对并发性和正确性起到决定性的影响。这方面可选的方法有:共享可变性、隔离可变性以及完全不可变性。
对于并发问题来说最好的解决方法是从根本上消灭它而不是花很多时间解决它。要做到这一点其实很简单,只要消除可变状态就可以了,即我们要围绕不可变性或至少是隔离可变性来设计应用程序。
下面是两种较新的基于JVM虚拟机开发语言Clojure,Scala,Groovy等的解决方案
1.软件事务内存STM(Software Transaction Memory)
STM是针对共享可变性问题的一次大胆尝试,其核心思路是将可变实体从不可变状态值中分离出来。STM是经由Clojure成功实践之后才逐渐流行起来的。在Clojure语言中,状态是不可变的,而托管实体仅在STM的事务控制范围是可变的。这种做法不仅可以使可变实体的行为具备可预测性和确定性,同时还提供了一种显式的锁无关的编程方法。
然而STM存在两个主要缺陷。其一,如果项目所使用的编程语言不是Clojure,那么必须格外小心,以确保锁处理的状态除了托管实体都是不可变的,而这一问题对于JVM上的绝大多数语言都同样存在。其二,必须确保事务的实现代码都是幂等的且无任何副作用。
也正是由于这个原因,STM更适用于写冲突不频繁的应用场景。因为在冲突不频繁的情况下自动重做的策略是OK的,而在某些极端情况下该策略可能会导致严重的性能问题。总而言之,只要我们能够小心谨慎地处理托管的共享可变性,STM也能够实现理想的并发度。但是在没有底层语言支持的情况下,我们要达到这一目标的代价会比用Clojure实现大很多。
2.基于角色的模型
通过将隔离可变性的思想发扬光大,该模型从根本上消除了同步问题。其主要特点为:每个角色均各自独立运行,相互之间依靠高效的异步消息进行通信,并保证同时到达的消息通过排队的方式逐个处理。
该模型的主要问题是,包括读操作在内的并发任务之间的所有通信都是通过消息来完成的。所以那些需要获得完全一致的状态值的读操作就不得不交叉地发送请求以相互印证。使用多角色协作来设计应用程序的方法与设计一个OO应用程序的方法是有很大区别的。
在基于角色的模型中,不但要确保消息是不可变的,并且为了使其能够独立完成关键任务,对角色的定义也都是相当的粗粒度的。此外,应当注意不要将角色们之间的交互设计得过于繁复,以避免角色们都将时间消费在相互等待上而无法处理手头堆积的问题。
总而言之,选择并发模型并未将我们强行捆绑到特定的语言上。模型的选择是由应用程序的特性、我们使用的设计方法以及团队进行自我调整以适应新模型的意愿共同决定的。
基于JVM规范的并发编程解决方案的更多相关文章
- (4)socket的基础使用(基于TCP协议的并发编程)
需要实现并发需要依靠socketserver 模块 socketserver模块下有几个功能 def __init__(self, request, client_address, server): ...
- 并发编程 01—— ThreadLocal
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 并发编程 05—— Callable和Future
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 并发编程 17—— Lock
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- [CSAPP笔记][第十二章并发编程]
第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...
- 并发编程 20—— AbstractQueuedSynchronizer 深入分析
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 并发编程 02—— ConcurrentHashMap
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 并发编程 06—— CompletionService :Executor 和 BlockingQueue
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
随机推荐
- 关于jsonp(~~原理和理解)
JSON和JSONP 与XML相比,JSON是一个轻量级的数据交换格式.JSON对于JavaScript开发人员充满魅力的原因在于JSON本身就是Javascript中的对象. 例如一个ticker对 ...
- Java学习笔记:内部类/匿名内部类的全面介绍
编写java程序时,一般一个类(或者接口)都是放在一个独立的java文件中,并且类名同文件名(如果类是public的,类名必须与文件名一致:非public得,无强制要求).如果想把多个java类放在一 ...
- HDU1316(求区间斐波那契数的个数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1316 题意:给两个数a和b,其中它们可能很大,最大到10^100,然后求去区间[a,b]内有多少个fib数 ...
- HDU 4679 String
String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Sub ...
- 将EC2里的实例导出到RAW文件并进行修改
你可能有自己的instance在amazon云环境里面,或者是你想深度修改一下marketplace里面提供的那些系统又估计运行中的instance改动不方便 亚马逊作为云计算领域的大哥大,我不得不说 ...
- BZOJ AC 200题留念
话说本来想200AC就把题目总结一下...但是我现在挺懒的..不想弄...以后再来吧.
- 从 Qt 的 delete 说开来
原地址:http://blog.csdn.net/dbzhang800/article/details/6300025 在C++中学习过程中,我们都知道: delete 和 new 必须 配对使用(一 ...
- JVM调优总结(十一)-反思
垃圾回收的悖论 所谓“成也萧何败萧何”.Java的垃圾回收确实带来了很多好处,为开发带来了便利.但是在一些高性能.高并发的情况下,垃圾回收确成为了制约Java应用的瓶颈.目前JDK的垃圾回收算法,始终 ...
- debian安装jdk8
1.官方下载java想安装的JAVA版本: http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.比如说,常安装的J ...
- Swift学习之UI开发初探
Swift是供iOS和OS X应用编程的新编程语言.相信很多开发者都在学习这门新语言.废话不多说,下面我就来学习使用Swift创建一个简单的UI应用程序. AD: 概述 Apple近日发布了Swift ...