各种程序员都工作在各自的程序抽象维度,如果我们发现解决一件事情比较难,也许是我们面对的抽象级别还不够高,或者引入的间接程度不够,本文以抽象角度来剖析并发编程。
一、机器和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并发编程实践 中文 高清 带书签 完整版 Doug Lea .pdf”,我们可以推断出这份文档主要聚焦于Java并发编程的技术实践与理论探讨。下面将从多个角度来解析这个文档可能涵盖的关键知识点。 ...
### Java虚拟机并发编程知识点详解 #### 一、并发与并行的概念 在讨论Java虚拟机(JVM)中的并发编程之前,我们首先需要理解“并发”与“并行”的概念。 - **并发**:指在同一时间段内,多个任务交替执行。在单核...
Java并发编程是Java开发中必不可少的一部分,涉及到多线程、同步机制、线程池以及并发工具类等多个核心知识点。以下是对这些主题的详细说明: 1. **线程安全与锁 Synchronized 底层实现原理**: 线程安全是指在多...
《Java 7并发编程实战手册》是一本深入探讨Java并发编程的权威指南,它涵盖了Java 7版本中的并发工具和最佳实践。这本书的源码打包提供了丰富的实例,可以帮助读者更好地理解并应用书中所讲解的概念。这里我们将详细...
- **未来趋势**:随着硬件技术的发展,未来的并发编程将更加依赖于高级抽象和技术框架的支持,使得开发者能够更加专注于业务逻辑而非底层细节。 通过上述内容的梳理,可以看出《Java虚拟机并发编程》这本书不仅深入...
目前多数高级编程语言如Java、C#、Go等都内置了强大的并发支持,提供了线程、协程等并发原语,有助于简化并发编程的复杂性。此外,一些并发编程库和框架也能够帮助开发者更好地实现和管理并发任务。 综上所述,...
"Java并发思维导图" 这句话表明了一个中心主题,即Java并发编程的相关概念和知识。以下是对这句话的扩充: Java并发编程是Java编程中的一个重要领域,它涉及到多个线程之间的协作和竞争。在Java中,并发编程可以...
《Java并发编程英文版》是Doug Lea所著的一部关于Java并发编程的经典作品。Doug Lea是计算机科学领域的知名学者,尤其在并发编程、设计模式、软件工程等领域有深入的研究和独到的见解。本书在1996年首次出版,至今仍...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。《java并发编程的核心方法和框架》这本书旨在深入探讨这一主题,帮助开发者掌握Java...
在探讨Java并发编程与高并发解决方案的过程中,我们会涉及到一系列核心概念和相关技术。本文将基于文档《Java并发编程与高并发解决方案-学习笔记***.pdf》中提供的内容,来详细阐述并发编程和高并发的基本概念、CPU...
Java并发编程实战是针对Java并发编程的详细指南,随着多核处理器的普及,多线程并发编程成为了提升应用程序性能的关键技术之一。从Java 5和Java 6版本开始,Java在并发编程方面取得了显著的进步,不仅改进了Java...
Executor框架作为Java并发编程的一个高级抽象,允许程序员以声明性的方式定义任务,而无需直接处理线程的创建和管理。第10章详细解释了Executor框架的整体结构和成员组件,为读者展示如何利用这一框架简化并发任务的...
Java并发编程是Java开发中的重要领域,它涉及如何在多处理器或多核心环境下高效地执行程序。本套源码集合全面涵盖了Java并发编程的核心知识点,包括但不限于对象锁、Executors多任务线程框架以及线程池的实现。下面...
本文深入探讨了Java并发编程的关键组件——抽象队列同步器(AQS)及其在ReentrantLock的应用。AQS是处理线程同步问题的高效工具,是Java并发编程中的核心。文章首先简要介绍了并发编程领域的先驱Doug Lea。重点在于...
本文主题为Java并发编程,内容涉及并发编程的底层机制及其深刻理解。文章首先提出了并行编程的难题,然后讨论了并行编程的目标,包括性能提升、生产率和通用性。接着探讨了并行编程的替代方案,例如通过实例化多个...
高并发编程知识点总结 ...本节总结了高并发编程的相关知识点,包括线程和线程池、线程的实现方式、Java中的Callable和Future、线程安全问题、线程池的重要性和深度解析线程池中的重要接口和抽象类等。
4. **并发工具类**:`java.util.concurrent`包包含了许多并发工具,如`ExecutorService`、`Future`、`Callable`、`Semaphore`、`CountDownLatch`和`CyclicBarrier`等,它们为并发编程提供了更高级别的抽象和控制。...
根据提供的文件标题、描述以及部分具体内容,我们可以提炼出与Java并发编程及Java虚拟机相关的多个重要知识点。下面将对这些知识点进行详细的阐述。 ### Java并发编程基础 #### 1. 并发与并行的区别 - **并发**指...
Java设计模式和并发编程是Java开发中的两个重要领域,它们对于构建高效、可维护的软件系统至关重要。设计模式是经过时间验证的解决常见问题的最佳实践,而并发编程则是利用多核处理器的优势,提高应用程序的执行效率...