SlideShare a Scribd company logo
1 of 15
01. 并行与并发
概念
并行与并发
• 并发性,说的就是多件事情能够同时进行(并行)的一种能力。
• 要点:并发是性质,并行是状态。并行的事情具有并发性,但是
具有并发性的事情不一定并行地进行;具有并发性的事件不一定
并行地进行。
并发编程的抽象
• 并发编程基于下面这种抽象模型,包含了三要素:
• 数据
• 线程
• 任务
数据
• 并发编程的难点
• 数据需要在不同的线程之间共享,因为多线程程序在运行时存在交错
(interleaving),不加限制共享就会带来数据读写的错误。所有的并发
编程设施和理论都是基于这个起源来搭建。
数据-存储分类
• Immutable(线程安全)
• Mutable
• 原子存储(Atomic)
• 固定存储(Java原生数组)
• 动态存储(动态申请)
数据-关注点
• 并发编程中我们更关注数据的生命周期和共享策略,即数据什么时候创
建,什么时候读取,什么时候更新,什么时候销毁释放。
• 这些问题在并发编程中如果没有妥善地设计,会带来非常多难以重现和
调试的问题,而资深的软件工程师,都会在这些问题上有深入的理解和
长期的经验。
数据-关注点
• 我们也需要了解
• 多线程环境中一门语言的内存模型
• 数据的生命周期
• 也需要回答
• 什么级别的操作即使我们不用锁也是线程安全的?
• 使用那些并发工具才能保证线程安全?
线程
• 每个语言都有一套机制,负责线程的创建、运行、切换和结束
• 并发编程三范式
• Procedural
• Functional
• CSP (Communicating Sequential Processes)
线程-Procedural范式
• 以C语系(C++、Java)为代表的过程式编程语言,它在处理并发
编程时,通常是通过同步工具来进行的
• 并发同步工具抽象级别由高到低
1. BlockingQueue、TaskQueue、CountDownLatch、Reader-Writer Lock
2. Mutex、Conditional Variable、Future、Promise
3. lock-free、atomic、spin lock
线程-Functional范式
• 函数当成语言里的一等公民来对待,以提供更高的抽象能力
• 核心概念
• IMMUTABLE
• LAMBDA CALCULUS
• NO SIDE EFFECT
• HIGHER ORDER FUNCTIONS
• PATTERN MATCHING
• LAZY EVALUATION
• CURRYING
• 参考
• https://www.coursera.org/learn/programming-languages
线程-CSP(Communicating Sequential Processes)
• 提供类似Go语言的机制
• 通过一种类似于通信管道的方式来做线程的同步
• 让并发编程的设计更容易,出bug的可能性更小
• 核心观点
• Do not communicate by sharing memory; instead, share memory by
communicating
任务
• 任务与线程的关系
• 一个线程,可以在它的生命周期里处理数亿个任务
• 抽象来看,一个任务,它包含
• 前序——前置任务依赖;
• 读——输入、共享数据读;
• 计算——执行的计算和操作;
• 输出——共享数据写;
• 后续——后续任务通知
• 即任务五要素:前序、读、计算、写、后续
任务
• 五要素充分决定:自动化任务的调度策略。
• 实际情况是,对于具体任务需要
• 手工编码调度策略,
• 决定同步工具,
• 熟悉底层原理,
• 量化估算性能。
Petri 网自动并发调度
小结
• 并发编程核心技术
• 数据共享
• 线程间任务顺序
• 线程的管理
• 任务的抽象与封装
思考题
• 列出你知道的语言是如何为并发提供支持的?它们有什么区别?

More Related Content

Viewers also liked (8)

Reglamento interno lufrey
Reglamento interno lufreyReglamento interno lufrey
Reglamento interno lufrey
 
Tang 05 lewis dot diagrams
Tang 05   lewis dot diagramsTang 05   lewis dot diagrams
Tang 05 lewis dot diagrams
 
Carpeta scay 2016
Carpeta scay 2016Carpeta scay 2016
Carpeta scay 2016
 
Presentación GridUAM 201112
Presentación GridUAM 201112Presentación GridUAM 201112
Presentación GridUAM 201112
 
Gametogénesis
GametogénesisGametogénesis
Gametogénesis
 
Mesa situacional ut ldsp jul 2013
Mesa situacional ut ldsp jul 2013Mesa situacional ut ldsp jul 2013
Mesa situacional ut ldsp jul 2013
 
Joseph Problema 29 Fpp
Joseph Problema 29 FppJoseph Problema 29 Fpp
Joseph Problema 29 Fpp
 
Lewis Structures
Lewis StructuresLewis Structures
Lewis Structures
 

More from Tao He

A software fault localization technique based on program mutations
A software fault localization technique based on program mutationsA software fault localization technique based on program mutations
A software fault localization technique based on program mutationsTao He
 
Introduction to llvm
Introduction to llvmIntroduction to llvm
Introduction to llvmTao He
 
Testing survey
Testing surveyTesting survey
Testing surveyTao He
 
Testing survey by_directions
Testing survey by_directionsTesting survey by_directions
Testing survey by_directionsTao He
 
Smart debugger
Smart debuggerSmart debugger
Smart debuggerTao He
 
Mutation testing
Mutation testingMutation testing
Mutation testingTao He
 
C语言benchmark覆盖信息收集总结4
C语言benchmark覆盖信息收集总结4C语言benchmark覆盖信息收集总结4
C语言benchmark覆盖信息收集总结4Tao He
 
Django
DjangoDjango
DjangoTao He
 
基于覆盖信息的软件错误定位技术综述
基于覆盖信息的软件错误定位技术综述基于覆盖信息的软件错误定位技术综述
基于覆盖信息的软件错误定位技术综述Tao He
 
Java覆盖信息收集工具比较
Java覆盖信息收集工具比较Java覆盖信息收集工具比较
Java覆盖信息收集工具比较Tao He
 
Testing group’s work on fault localization
Testing group’s work on fault localizationTesting group’s work on fault localization
Testing group’s work on fault localizationTao He
 
Muffler a tool using mutation to facilitate fault localization 2.0
Muffler a tool using mutation to facilitate fault localization 2.0Muffler a tool using mutation to facilitate fault localization 2.0
Muffler a tool using mutation to facilitate fault localization 2.0Tao He
 
Muffler a tool using mutation to facilitate fault localization 2.3
Muffler a tool using mutation to facilitate fault localization 2.3Muffler a tool using mutation to facilitate fault localization 2.3
Muffler a tool using mutation to facilitate fault localization 2.3Tao He
 
Semantic Parsing in Bayesian Anti Spam
Semantic Parsing in Bayesian Anti SpamSemantic Parsing in Bayesian Anti Spam
Semantic Parsing in Bayesian Anti SpamTao He
 
Problems
ProblemsProblems
ProblemsTao He
 
A survey of software testing
A survey of software testingA survey of software testing
A survey of software testingTao He
 
Cleansing test suites from coincidental correctness to enhance falut localiza...
Cleansing test suites from coincidental correctness to enhance falut localiza...Cleansing test suites from coincidental correctness to enhance falut localiza...
Cleansing test suites from coincidental correctness to enhance falut localiza...Tao He
 
Concrete meta research - how to collect, manage, and read papers?
Concrete meta research - how to collect, manage, and read papers?Concrete meta research - how to collect, manage, and read papers?
Concrete meta research - how to collect, manage, and read papers?Tao He
 

More from Tao He (18)

A software fault localization technique based on program mutations
A software fault localization technique based on program mutationsA software fault localization technique based on program mutations
A software fault localization technique based on program mutations
 
Introduction to llvm
Introduction to llvmIntroduction to llvm
Introduction to llvm
 
Testing survey
Testing surveyTesting survey
Testing survey
 
Testing survey by_directions
Testing survey by_directionsTesting survey by_directions
Testing survey by_directions
 
Smart debugger
Smart debuggerSmart debugger
Smart debugger
 
Mutation testing
Mutation testingMutation testing
Mutation testing
 
C语言benchmark覆盖信息收集总结4
C语言benchmark覆盖信息收集总结4C语言benchmark覆盖信息收集总结4
C语言benchmark覆盖信息收集总结4
 
Django
DjangoDjango
Django
 
基于覆盖信息的软件错误定位技术综述
基于覆盖信息的软件错误定位技术综述基于覆盖信息的软件错误定位技术综述
基于覆盖信息的软件错误定位技术综述
 
Java覆盖信息收集工具比较
Java覆盖信息收集工具比较Java覆盖信息收集工具比较
Java覆盖信息收集工具比较
 
Testing group’s work on fault localization
Testing group’s work on fault localizationTesting group’s work on fault localization
Testing group’s work on fault localization
 
Muffler a tool using mutation to facilitate fault localization 2.0
Muffler a tool using mutation to facilitate fault localization 2.0Muffler a tool using mutation to facilitate fault localization 2.0
Muffler a tool using mutation to facilitate fault localization 2.0
 
Muffler a tool using mutation to facilitate fault localization 2.3
Muffler a tool using mutation to facilitate fault localization 2.3Muffler a tool using mutation to facilitate fault localization 2.3
Muffler a tool using mutation to facilitate fault localization 2.3
 
Semantic Parsing in Bayesian Anti Spam
Semantic Parsing in Bayesian Anti SpamSemantic Parsing in Bayesian Anti Spam
Semantic Parsing in Bayesian Anti Spam
 
Problems
ProblemsProblems
Problems
 
A survey of software testing
A survey of software testingA survey of software testing
A survey of software testing
 
Cleansing test suites from coincidental correctness to enhance falut localiza...
Cleansing test suites from coincidental correctness to enhance falut localiza...Cleansing test suites from coincidental correctness to enhance falut localiza...
Cleansing test suites from coincidental correctness to enhance falut localiza...
 
Concrete meta research - how to collect, manage, and read papers?
Concrete meta research - how to collect, manage, and read papers?Concrete meta research - how to collect, manage, and read papers?
Concrete meta research - how to collect, manage, and read papers?
 

Java 并发编程笔记:01. 并行与并发 —— 概念

Editor's Notes

  1. 其中1.、2.中的设施用得最多,也能够处理绝大多数的情况,不过同时也有大量的细节需要我们注意,在不断的使用中累计经验,性能调优实践与直觉全然不同【参考这里】,例如自旋锁、例如读写锁、例如多线程,这些并发同步工具的使用和工程经验和量化分析紧密相关,直觉往往是会带来低性能。而在工程实践中,很多问题也都是不熟悉接口和语言细节造成的。有人说具体的语言并不重要,但是我得说,至少对于并发编程来说,一定至少要有一门精通的语言。熟悉的语言就是称手的兵器,在熟悉语言和陌生语言里开发,其开发效率和出bug的可能性都有接近十倍的差距。 作者:慕尤才 链接:https://zhuanlan.zhihu.com/p/20892402 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  2. 要说C语言是冯诺依曼计算机体系中工程语言的一座高峰,那么函数式Lisp就是计算机抽象理论语言的另外一座高峰。因为这些概念,函数式的概念在本质上就特别适合用来做并发编程。但是纯函数式编程语言,例如Haskell,在编程方式和语言基础设施效率上还不太能让工业界接受。但是其中的概念正在逐步引入语言的新标准(C++1x、Java8),令其在并发编程上有更好的抽象能力和表达能力。 作者:慕尤才 链接:https://zhuanlan.zhihu.com/p/20892402 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  3. 这样的任务或许在一个进程中同时存在千千万万个,在不同的线程中交错运行,几乎是乱序进行;大任务可以转化为若干个小任务,任务越小,共享的数据结构越小,设计并发就更容易。这在没有线程概念的程序员来看,简直就是一个新世界。而如何对这些毛线团一般的任务进行同步,必然会让新手毫无头绪,不行就胡乱加锁,设计出bug百出的程序,花大量时间也无法调试正常。 作者:慕尤才 链接:https://zhuanlan.zhihu.com/p/20892402 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  4. 理想中的情况是,语言只需要定义一个个任务,指定依赖顺序和共享数据,不需要指定调度细节,语言运行时和操作系统就能自动生成任务调度的方案,让一个个任务按照依赖关系和数据依赖,以最优的顺序执行。但是,现在大部分情况下任务的调度,任务如何在线程中执行,都是由程序员手工编码好的。在并发编程中的自动化,可以参考petri网理论或者Funtional的约束来实现,不过现在看,想要在工业界流行起来还比较遥远。Erlang和Go语言已经开始做了类似抽象和自动并发调度,Rust语言也在编译期对并发的易错点进行了形式化验证。 作者:慕尤才 链接:https://zhuanlan.zhihu.com/p/20892402 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。