`
oojdon
  • 浏览: 39573 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

并发编程的JAVA抽象

阅读更多

 

各种程序员都工作在各自的程序抽象维度,如果我们发现解决一件事情比较难,也许是我们面对的抽象级别还不够高,或者引入的间接程度不够,本文以抽象角度来剖析并发编程。


一、机器和OS级别抽象

(1) 冯诺伊曼模型

经典的顺序化计算模型,貌似可以保证顺序化一致性,但是没有哪个现代的多处理架构会提供顺序一致性,冯氏模型只是现代多处理器行为的模糊近似。
这个计算模型,指令或者命令列表改变内存变量直接契合命令编程泛型,它以显式的算法为中心,这和声明式编程泛型有区别。就并发编程来说,会显著的引入时间概念和状态依赖
所以所谓的函数式编程可以解决其中的部分问题。

(2) 进程和线程

进程抽象运行的程序,是操作系统资源分配的基本单位,是资源cpu,内存,IO的综合抽象。

线程是进程控制流的多重分支,它存在于进程里,是操作系统调度的基本单位,线程之间同步或者异步执行,共享进程的内存地址空间。

(3)  并发与并行

并发,英文单词是concurrent,是指逻辑上同时发生,有人做过比喻,要完成吃完三个馒头的任务,一个人可以这个馒头咬一口,那个馒头咬一口,这样交替进行,最后吃完三个馒头,这就是并发,因为在三个馒头上同时发生了吃的行为,如果只是吃完一个接着吃另一个,这就不是并发了,是排队,三个馒头如果分给三个人吃,这样的任务完成形式叫并行,英文单词是parallel。

回到计算机概念,并发应该是单CPU时代或者单核时代的说法,这个时候CPU要同时完成多任务,只能用时间片轮转,在逻辑上同时发生,但在物理上是串行的。现在大多数计算机都是多核或者多CPU,那么现在的多任务执行方式就是物理上并行的。

为了从物理上支持并发编程,CPU提供了相应的特殊指令,比如原子化的读改写,比较并交换。

(4) 平台内存模型  

在可共享内存的多处理器体系结构中,每个处理器都有它自己的缓存,并且周期性的与主存同步,为什么呢?因为处理器通过降低一致性来换取性能,这和CAP原理通过降低一致性来获取伸缩性有点类似,所以大量的数据在CPU的寄存器中被计算,另外CPU和编译器为了性能还会乱序执行,但是CPU会提供存储关卡指令来保证存储的同步,各种平台的内存模型或者同步指令可能不同,所以这里必须介入对内存模型的抽象,JMM就是其中之一。 

二、编程模型抽象

(1) 基于线程模型

(2) 基于Actor模型

(3) 基于STM软件事务内存

........

Java体系是一个基于线程模型的本质编程平台,所以我们主要讨论线程模型。

三、并发单元抽象

大多数并发应用程序都是围绕执行任务进行管理的,任务是抽象,离散的工作单元,所以编写并发程序,首要工作就是提取和分解并行任务。一旦任务被抽象出来,他们就可以交给并发编程平台去执行,同时在任务抽象还有另一个重要抽象,那就是生命周期,一个任务的开始,结束,返回结果,都是生命周期中重要的阶段。那么编程平台必须提供有效安全的管理任务生命周期的API。

四、线程模型

线程模型是Java的本质模型,它无所不在,所以Java开发必须搞清楚底层线程调度细节,不搞清楚当然就会有struts1,struts2的原理搞不清楚的基本灾难。

用线程来抽象并发编程,是比较低级别的抽象,所以难度就大一些,难度级别会根据我们的任务特点有以下几个类别

(1) 任务非常独立,不共享,这是最理想的情况,编程压力为0。

(2) 共享数据,压力开始增大,必须引入锁,Volatile变量,问题有活跃度和性能危险。

(3) 状态依赖,压力再度增大,这时候我们基本上都是求助jdk 提供的同步工具。

五、任务执行

任务是一个抽象体,如果被抽象了出来,下一步就是交给编程平台去执行,在Java中,描述任务的一个基本接口是Runnable,可是这个抽象太有限了,它不能返回值和抛受检查异常,所以Jdk5.0有另外一个高级抽象Callable。

任务的执行在Jdk中也是一个底级别的Thread,线程有好处,但是大量线程就有大大的坏处,所以如果任务量很多我们并不能就创建大量的线程去服务这些任务,那么Jdk5.0在任务执行上做了抽象,将任务和任务执行隔离在接口背后,这样我们就可以引入比如线程池的技术来优化执行,优化线程的创建。

任务是有生命周期的,所以Jdk5.0提供了Future这个对象来描述对象的生命周期,通过这个future可以取到任务的结果甚至取消任务。

六、锁

当然任务之间共享了数据,那么要保证数据的安全,必须提供一个锁机制来协调状态,锁让数据访问原子,但是引入了串行化,降低了并发度,锁是降低程序伸缩性的原罪,锁是引入上下文切换的主要原罪,锁是引入死锁,活锁,优先级倒置的绝对原罪,但是又不能没有锁,在Java中,锁是一个对象,锁提供原子和内存可见性,Volatile变量提供内存可见性不提供原子,原子变量提供可见性和原子,通过原子变量可以构建无锁算法和无锁数据结构,但是这需要高高手才可以办到。

分享到:
评论

相关推荐

    并发思维导图Java并发编程的相关概念和知识

    "Java并发思维导图" 这句话表明了一个中心主题,即Java并发编程的相关概念和知识。以下是对这句话的扩充: Java并发编程是Java编程中的一个重要领域,它涉及到多个线程之间的协作和竞争。在Java中,并发编程可以...

    Java并发Xmind思维导图

    "Java并发思维导图" 这句话表明了一个中心主题,即Java并发编程的相关概念和知识。以下是对这句话的扩充: Java并发编程是Java编程中的一个重要领域,它涉及到多个线程之间的协作和竞争。在Java中,并发编程可以...

    Java并发编程论述 pdf

    并发编程论述 题⽬ 01- 请你说⼀说什么是线程和进程? • 线程和进程的区别及关系 进程是程序运⾏的基本单位,⼀个JAVA程序的进程对应了⼀个JVM虚拟机实例。进程启动后会 为其分配固定的内存空间,进程和进程之间的...

    JAVA并发编程实践-线程执行-学习笔记

    所谓任务就是抽象、离散的工作单元。把一个应用程序的工作分离到任务中,可以简化程序 的管理,这种分离还在不同事务间划分了自然的分界线,在程序出现错误时可以很方便地进行恢复,还有利于提高程序的并发性。围绕...

    StudyJava:Java 基础学习(java编程思想和java技术核心卷)

    a)与“像是一个”(is-like-a)关系1.7 伴随多态的可互换对象1.8 单根继承结构1.9 容器1.9.1 参数化类型(范型)1.10 对象的创建和生命期1.11 异常处理:处理错误1.12 并发编程1.13 Java与Internet1.13.1 Web是什么...

    2023Java的学习

    Java的高级特性包括异常处理、多线程、文件和输入输出流、网络编程、反射、泛型、集合、枚举、并发编程等内容。这些内容是Java语言的高级特性,可以帮助程序员提高程序的性能和稳定性,是实现复杂程序的关键。 Java...

    java资料---Java SE.ppt

    Java发展史 面向对象基础 面向对象三大特征(封装、继承和多态) static和final 抽象类和接口 异常处理 集合框架 IO 并发编程 Java SE5中其它的重要新特性

    java最新高薪面试题库.docx

    Java中的抽象类有哪些特点? 什么是接口?Java中的接口有哪些特点? 什么是泛型?Java中的泛型有哪些特点? 什么是反射?Java中的反射有哪些应用场景? 什么是异常?Java中的异常有哪些类型?如何处理异常? 什么是...

    JAVA_API1.6文档(中文)

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...

    JAVA 7 程序设计.part1.rar

    接着阐述Swing的基础和高级知识、多态、注解、国际化、Java网络、JDBC、Java线程、并发工具、安全、Java Web应用程序、JavaServer Pages、Javadoc,以及应用程序部署等内容,掌握这部分内容有助于提升编程技能。

    java乐器源码-concurrency:Java并发编程知识梳理以及常见处理模式featuresandpatterns

    并发编程解决的核心问题 分工(如何高效地拆解任务并分配给线程)Fork/Join 框架 同步(指的是线程之间如何协作)CountDownLatch 互斥(保证同一时刻只允许一个线程访问共享资源)可重入锁 如何学习 跳出来,看全景...

    C++编程思想(Thinking in C++)完美版pdf

    Bruce Eckel 《Thinking in Java》(Java编程思想)作者。Eckel有20年专业编程经验,并自1986年起教育人们如何撰写面向对象程序,足迹遍及全球,成为一位知名的 C++教师和顾问,如今兼涉Java。他是C++标准委员会拥有...

    Java并发编程:用AQS写一把可重入锁

    之所以把这一章节叫做AQS简介而不是叫AQS详解,是因为已经有大神写过详解的文章Java并发之AQS详解,这篇文章对AQS的源码解析很透彻,博主读了之后受益匪浅,鉴于对原作者的尊重,所以如上附上原文的链接。...

    Java内存模型案例讲解.docx

    在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步,通信指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 Java语言的并发采用的是共享...

    Java内存结构

    Java内存结构: 深入理解Java内存模型一基础并发编程模型的分类Java内存模型的抽象重排序处理器重排序与内存屏障指令happens-before深入理解Java内存模型二重排序数据依赖性..

    Java 1.6 API 中文 New

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,...

    Thinking in java4(中文高清版)-java的'圣经'

    1.8 单根继承结构 1.9 容器 1.9.1 参数化类型(范型) 1.10 对象的创建和生命期 1.11 异常处理:处理错误 1.12 并发编程 1.13 Java与Internet 1.13.1 Web是什么 1.13.2 客户端编程 1.13.3 服务器端编程 1.22 总结 第...

    JAVA 7 程序设计.part2.rar

    接着阐述Swing的基础和高级知识、多态、注解、国际化、Java网络、JDBC、Java线程、并发工具、安全、Java Web应用程序、JavaServer Pages、Javadoc,以及应用程序部署等内容,掌握这部分内容有助于提升编程技能。

    Java基础知识点.html

    类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...

Global site tag (gtag.js) - Google Analytics