`
sharong
  • 浏览: 492250 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
D1667ae2-8cfc-3b68-ac7c-5e282789fa4a
论开源
浏览量:8691
7eb53364-fe48-371c-9623-887640be0185
Spring-data-j...
浏览量:13022
社区版块
存档分类
最新评论

基于JVM规范的并发编程解决方案

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

下面是两种较新的基于JVM虚拟机开发语言Clojure,Scala,Groovy等的解决方案
1.软件事务内存STM(Software Transaction Memory)
STM是针对共享可变性问题的一次大胆尝试,其核心思路是将可变实体从不可变状态值中分离出来。STM是经由Clojure成功实践之后才逐渐流行起来的。在Clojure语言中,状态是不可变的,而托管实体仅在STM的事务控制范围是可变的。这种做法不仅可以使可变实体的行为具备可预测性和确定性,同时还提供了一种显式的锁无关的编程方法。
然而STM存在两个主要缺陷。其一,如果项目所使用的编程语言不是Clojure,那么必须格外小心,以确保锁处理的状态除了托管实体都是不可变的,而这一问题对于JVM上的绝大多数语言都同样存在。其二,必须确保事务的实现代码都是幂等的且无任何副作用。
也正是由于这个原因,STM更适用于写冲突不频繁的应用场景。因为在冲突不频繁的情况下自动重做的策略是OK的,而在某些极端情况下该策略可能会导致严重的性能问题。总而言之,只要我们能够小心谨慎地处理托管的共享可变性,STM也能够实现理想的并发度。但是在没有底层语言支持的情况下,我们要达到这一目标的代价会比用Clojure实现大很多。

2.基于角色的模型
通过将隔离可变性的思想发扬光大,该模型从根本上消除了同步问题。其主要特点为:每个角色均各自独立运行,相互之间依靠高效的异步消息进行通信,并保证同时到达的消息通过排队的方式逐个处理。
该模型的主要问题是,包括读操作在内的并发任务之间的所有通信都是通过消息来完成的。所以那些需要获得完全一致的状态值的读操作就不得不交叉地发送请求以相互印证。使用多角色协作来设计应用程序的方法与设计一个OO应用程序的方法是有很大区别的。
在基于角色的模型中,不但要确保消息是不可变的,并且为了使其能够独立完成关键任务,对角色的定义也都是相当的粗粒度的。此外,应当注意不要将角色们之间的交互设计得过于繁复,以避免角色们都将时间消费在相互等待上而无法处理手头堆积的问题。

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

相关推荐

    Java并发编程与高并发解决方案-学习笔记-www.itmuch.com.pdf

    本文将基于文档《Java并发编程与高并发解决方案-学习笔记***.pdf》中提供的内容,来详细阐述并发编程和高并发的基本概念、CPU多级缓存与缓存一致性、以及Java内存模型。 ### 并发与高并发概念 在现代多线程编程中...

    JVM并发编程源代码

    《JVM并发编程源代码深度解析》 JVM(Java Virtual Machine)是Java程序的运行环境,它负责解释和执行字节码,是Java平台的核心组成部分。并发编程是利用多核处理器的优势,使得多个任务可以同时执行,提高系统效率...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段07讲、CPU以及CPU缓存的结构,解决高速缓存一致性问题的两种方案介绍.mp4 │ 高并发编程第二阶段08讲、并发编程的三个重要概念,原子性,可见性,有序性.mp4 │ 高并发编程第二阶段09讲、...

    01-并发编程之深入理解JMM&并发三大特性(一).pdf

    在Java中,指令重排序是JVM为了提高指令执行效率进行的一种优化策略,但同时也会带来并发编程中的有序性问题。JVM层面的内存屏障技术能够帮助我们控制指令的重排序,保证有序性。硬件层面,CPU缓存架构的设计以及...

    Java并发编程与高并发解决方案-学习笔记.pdf

    并发编程与高并发解决方案的学习笔记中,首先对并发与高并发进行了基本概念的介绍。并发指的是同时存在多个执行单元,但并不一定同时发生;而高并发是指系统能够同时处理很多的请求,这对于互联网分布式系统架构设计...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段07讲、CPU以及CPU缓存的结构,解决高速缓存一致性问题的两种方案介绍.mp4 │ 高并发编程第二阶段08讲、并发编程的三个重要概念,原子性,可见性,有序性.mp4 │ 高并发编程第二阶段09讲、...

    Java虚拟机并发编程.英文完整版.pdf

    - **JVM并发编程基础**:介绍了JVM如何支持并发执行,包括线程调度、同步机制等基本概念。 - **Java并发API**: - **`java.util.concurrent`包**:提供了一系列高级并发工具类,如`ExecutorService`、`Future`、`...

    Java并发编程艺术

    4. **并发工具类**:Java.util.concurrent包提供了丰富的并发工具类,如CountDownLatch、CyclicBarrier、Semaphore和ExecutorService等,它们为复杂的并发场景提供了便捷的解决方案。 5. **并发编程模式**:书中会...

    一本经典的多线程书籍 Java并发编程 设计原则与模式 第二版 (英文原版)

    7. **并发设计模式**:介绍了一些常见的并发设计模式,如双检锁/双重检查锁定(Double-Checked Locking)、幻读问题解决方案、工作窃取(Work Stealing)等,帮助开发者在实际项目中构建健壮的并发程序。 8. **并发...

    Java并发编程全景图.pdf

    9. 并发问题和解决方案 并发编程中常见问题包括死锁(DeadLock)、活锁(LiveLock)、优先级倒置(PriorityInversion)等。这些问题可能导致程序的性能下降或者死锁。解决这些问题的方法包括使用定时锁、避免循环...

    JAVA并发编程实践

    本书最后部分着重于并发程序的性能优化和调试技巧,包括如何使用JVM参数调优、如何利用工具进行并发性能监控和分析、如何定位和解决常见的并发错误等,为开发者提供了一套完整的并发编程解决方案。 总之,《JAVA...

    Java并发编程的艺术

    ### Java并发编程的艺术 #### 一、并发编程的挑战与应对策略 本书开篇即指出,随着现代计算机系统越来越依赖于多核处理器的并行计算能力,Java开发人员面临着前所未有的并发编程挑战。这些挑战包括但不限于数据...

    Java虚拟机并发编程

    并发策略,阐释了影响并发性的因素、如何有效实现并发,以及并发的设计方法等;第二部分:现代Java/JDK并发,讨论...第五部分:后记,回顾了《Java虚拟机并发编程》讨论的解决方案并总结了并发编程中的注意事项和佳实践

    Java并发编程实践(英文非扫描版-带书签目录)

    作者以清晰明了的方式,以实践的方法阐述了多线程编程中遇到的问题以及解决方案,帮助开发者解决日常编程中遇到的并发挑战。书中不仅讨论了多线程编程的基本理念,还深入到线程同步、线程安全、并发集合、锁优化、...

    Java 并发编程实战

    对于并发编程中的死锁、活锁和饥饿问题,书中给出了详细的分析和解决方案。读者还将学习如何通过`ThreadMXBean`和`ThreadInfo`进行线程监控,以及如何使用JVM的线程 dump 文件来调试并发问题。 最后,书中提到了...

    汪文君高并发编程(第1、2、3阶段)完整版.7z

    第二阶段可能涉及更高级的并发工具,如`Semaphore`(信号量)、`CountDownLatch`、`CyclicBarrier`和` Phaser`,这些工具用于协调多个线程的执行,实现复杂并发场景的解决方案。例如,`CountDownLatch`常用于等待一...

    高并发编程实战1,2,3阶段

    分布式锁解决方案 - **基于数据库实现**:利用数据库事务保证锁的一致性。 - **基于Redis实现**:使用Redis的SETNX命令等特性构建分布式锁。 - **基于Zookeeper实现**:利用Zookeeper提供的临时节点和顺序节点特性...

    java 并发编程的艺术

    并发编程的艺术作为一本探讨Java并发技术的书籍,通过深入剖析Java并发框架、线程池的实现原理以及JVM和CPU层面的相关知识,旨在帮助读者深入理解并发编程技术,并掌握如何在实际应用中解决并发编程所带来的挑战。...

    Netty多线程并发编程

    Netty是一个基于Java的网络编程框架,它提供了高性能、高可扩展性的网络编程解决方案。在Netty中,多线程并发编程是非常重要的。Netty提供了多种方式来实现并发编程,例如使用线程池、Executor框架等。 在Netty中,...

    Java高并发编程,构建并发编程知识体系,提升面试成功率视频教程

    4. **死锁、活锁与饥饿**:了解这些并发问题及其解决方案是必要的。死锁是两个或更多线程相互等待对方释放资源导致的僵局;活锁则是线程不断重试,但无法继续执行的状态;饥饿则指某线程因资源分配不公平而无法获得...

Global site tag (gtag.js) - Google Analytics