atitit 高并发之道 attilax著.docx 1. 概念 2 2. 并发一般涉及如下几个方面: 4 2.1. 多线程编程(已过时,不介绍) 4 2.2. 异步编程 4 2.3. 并行编程

atitit 高并发之道 attilax.docx

1. 概念 2

2. 并发一般涉及如下几个方面: 4

2.1. 多线程编程(已过时,不介绍) 4

2.2. 异步编程 4

2.3. 并行编程 4

2.4. 响应式编程 4

2.5. 数据流编程 4

3. 任务并行库(TPL)  定时器  5

4. 线程 5

4.1. 线程安全性  2.2 原子性    2.3 加锁机制 5

4.2. 5

4.3. 线程封闭3.3.1Ad-hoc线程封闭   3.3.2 栈封闭   3.3.3ThreadLocal 5

5. 线程池 5

6. 异步 6

6.1. 异步 6

6.2. 同步与锁关键字 6

6.3. 5.2 并发容器并发集合 6

6.4. Future模式 6

6.5. 6

7. 其他 6

7.1. 5.3 阻塞队列和生产者-消费者模式5.3.2 串行线程封闭 5.3.3 双端队列与工作密取  6

7.2. 5.4 阻塞方法与中断方法 原子变量与非阻塞同步机制 6

7.3. 协程 6

7.4. 5.5 同步工具类 5.5.1 闭锁 5.5.2FutureTask5.5.3 信号量 5.5.4 栅栏  6

7.5. 死锁的避免与诊断 6

7.6. 7

8. 7

9. 异步、多线程、任务、并行的本质 7

10. 现在,该用什么来编写多线程  7

10.1.1. 1,异步编程 8

10.2. 响应式编程 8

10.3. ,数据流编程 9

10.4. 5Actor模型 9

11. Qa 9

12. Java c# .net c++的并发技术 10

12.1. Java并发编程实战(第16Jolt大奖提名图书,Java并发编程必读佳作 10

12.2. Java并发技术 11

13. 22. Java c# .net c++的并发技术 7 11

13.1. 22.1. Java并发编程实战(第16Jolt大奖提名图书,Java并发编程必读佳作 8 11

13.2. 22.2. Java并发技术 8 11

13.3. 22.3. C#多线程编程实战( ((美... 8 11

13.4. 22.4. Line 278:   《C++并发编程实战》 Line 285: 1章 你好,C++并发世界 9 11

13.5. 22.5. C#并发编程经典实例》 9 11

1. 概念

第一章 
编写正确的程序很难,而编写正确的并发程序則难上加难。与串行程序相比,在并发程序中存在更多容易出错的地方。那么,为什么还要编写并发程序?线程是Java语言中不可或缺的重要功能,它们能使复杂的异步代码变得更简单,从而极大地简化了复杂系统的开发。此外,要想充分发挥多处理器系统的强大计算能力,最简单的方式就是使用线程。随着处理器数量的持续增长,如何高效地使用并发正变得越来越重要。
1.1 并发简史
在早期的计算机中不包含操作系统,它们从头到尾只执行一个程序,并且这个程序能访问计算机中的所有资源。在这种裸机环境中,不仅很难编写和运行程序,而且每次只能运行一个程序,这对于昂贵并且稀有的计算机资源来说也是一种浪费。
操作系统的出现使得计算机每次能运行多个程序,并且不同的程序都在单独的进程中运行:操作系统为各个独立执行的进程分配各种资源,包括内存,文件句柄以及安全证书等。如果需要的话,在不同的进程之间可以通过一些粗粒度的通信机制来交换数据,包括:套接字、信号处理器、共享内存、信号量以及文件等。
之所以在计算机中加入操作系统来实现多个程序的同时执行,主要是基于以下原因:
资源利用率。在某些情况下,程序必须等待某个外部操作执行完成,例如输入操作或输出操作等,而在等待时程序无法执行其他任何工作。因此,如果在等待的同时可以运行另一个程序,那么无疑将提高资源的利用率。
公平性。不同的用户和翠序对于计算机上的资源有着同等的使用权。一种高效的运行方式是通过粗粒度的时间分片(TimeSlicing)使这些用户和程序能共享计算机资源,而不是由一个程序从头运行到尾,然后再启动下一个程序。
便利性。通常来说,在计算多个任务时,应该编写多个程序,每个程序执行一个任务并在必要时相互通信,这比只编写一个程序来计算所有任务更容易实现

2. 并发一般涉及如下几个方面:

2.1. 多线程编程(已过时,不介绍)

2.2. 异步编程

2.3. 并行编程

2.4. 响应式编程

2.5. 数据流编程

 

3. 任务并行库(TPL)  定时器

4. 线程

4.1. 线程安全性  2.2 原子性    2.3 加锁机制

4.2.  

4.3. 线程封闭3.3.1Ad-hoc线程封闭   3.3.2 栈封闭   3.3.3ThreadLocal

5. 线程池

6. 异步

6.1. 异步

6.2. 同步与锁关键字

6.3. 5.2 并发容器并发集合

6.4. Future模式

6.5.  

7. 其他

7.1. 5.3 阻塞队列和生产者-消费者模式(5.3.2 串行线程封闭 5.3.3 双端队列与工作密取

7.2. 5.4 阻塞方法与中断方法
原子变量与非阻塞同步机制

7.3. 协程

7.4. 5.5 同步工具类 5.5.1 闭锁 5.5.2FutureTask5.5.3 信号量 5.5.4 栅栏

7.5. 死锁的避免与诊断

7.6.  

8. 


9. 异步、多线程、任务、并行的本质

这四个概念对应在CLR中的本质,本质都是多线程。

异步,简单的讲就是BeginInvokeEndInvoke模式,它在CLR内部线程池进行管理;

多线程,体现在C#中,可以由类型Thread发起。也可以由ThreadPool发起。前者不受CLR线程池管理,后者则是。FCL团队为了各种编程模型的方便,还另外提供了BackgroundWorker和若干个Timer,基本上它们都是ThreadPool的加强,增加了一些和调用者线程的交互功能;

任务(Task),为FCL4.0新增的功能,在一个称之为任务并行库(TPL)的地方,其实也就是System.Threading.Tasks命名空间下。任务并行库名字取的很玄乎,其实它也是CLR线程池的加强。优化了线程间的调度算法,增加了和调用者线程的交互功能;

并行(Parallel),为FCL4.0新增的功能,也属于TPL。并行在后台使用Task进行管理,说白了,因为Task使用的线程池线程,所以Parallel自然使用的也是线程池线程进行管理,它的本质仅仅是进一步简化了Task。在这里要增进一个对于并行的理解。实际上,多线程天然就是并行的。及时不用任务并行库,用Thread类型新起两个线程,CLR或者说Windows系统也会将这两个线程根据需要安排到两个CPU上去执行。所以,并不是因为多了任务并行库,CLR才支持并行计算,任务并行库只是提供了一组API,使我们能够更好的操纵线程进行并行开发而已。

 

10. 现在,该用什么来编写多线程 

如果你在FRAMEWORK4.0下编写代码,那么应该按照这个优先级来撰写多线程代码: 

优先

次优先

不得以

Parallel(含扩展库PLinq

Task

ThreadPoolBackgroundWorkerTimer

异步

Thread

这个表满足了大部分情况下的一个优先级指导,但在某些情况下会有例外。

多线程编程(已过时,不介绍)

10.0.1. 1,异步编程

异步编程就是使用future模式(又称promise)或者回调机制来实现(Non-blocking on waiting)。

微软还特意把异步编程分作了3种不同的模型:基于任务的模式(TAP)就是我上面推荐的这种,基于事件的模式(EAP)和异步编程模型(APM)我上面不推荐的事件和回调。

 

10.1. 响应式编程

响应式编程最近成为了一个Buzzword,其实微软6年前就开始给.NET提供一个Reactive 
Extensions
了。一开始要理解响应式编程有点困难,但是一旦理解了,你就会对它的强大功能爱不释手。简单来说,响应式编程把事件流看作数据流,不过数据流是从IEnumable中拉取的,而数据流是从IObservable推送给你的。为什么响应式编程可以实现并发呢?这是因为Rx做到线程不可知,每次事件触发,后续的处理会从线程池中任意取出一个线程来处理。且可以对事件设置窗口期和限流。举个例子,你可以用Rx来让搜索文本框进行延迟处理(而不用类似我很早的时候用个定时器来延迟了)。

10.2. ,数据流编程

数据流(DataFlow)编程可能大家就更陌生了,不过还是有些常用场景可以使用数据流来解决。数据流其实是在任务并行库(TPL)上衍生出来的一套处理数据的扩展(也结合了异步的特性),TPL也是处理并行编程中任务并行和数据并行的基础库。

望文生义,TPL DataFlow就是对数据进行一连串处理,首先为这样的处理定义一套网格(mesh),网格中可以定义分叉(fork)、连接(join)、循环(loop)。数据流入这样的处理网格就能够并行的被处理。你可以认为网格是一种升级版的管道,实际上很多时候就是被当作管道来使用。使用场景可以是“分析文本文件中词频”,也可以是“处理生产者/消费者问题”。

 

10.3. 5Actor模型

Scala有Akka,其实微软研究院也推出了Orleans来支持了Actor模型的实现,当然也有Akka.NET可用。Orleans设计的目标是为了方便程序员开发需要大规模扩展的云服务,

 

11. Qa

.2:何时用异步,何时用线程或线程池

这需要从“IO操作的DMADirect Memory Access)模式讲起。通过DMA的数据交换几乎可以不损耗CPU的资源。在硬件部分,硬盘、网卡、声卡、显卡等都有DMA功能。可以简单的认为,当我们的工作线程需要操作I/O资源的时候(如读取一个大文件、读取一个网页、读取Socke包等),我们就需要用异步去做这些事情。异步模式只会在工作开始以及工作结束的时候占用CLR线程池,其它时候由硬盘、网卡等硬件设备来处理具体的工作,这就不会过多占用到CPU空间和时间损耗。 

概括而言:

计算密集型工作,直接采用线程;

IO密集型工作,采用异步机制;

当我们不清楚什么工作是I/O密集型的,一个不是很恰当的指导就是:查看FCL类型成员,如果成员提供了类似BeginDosomething方法的,则优先使用它,而不是新起一个线程或丢到线程池。

 

3.4:何时用Thread 
以上的各种线程模型,它们最终都是Thread。 那么什么时候需要Thread直接出场呢?

最重要的使用Thread的理由是,我们需要控制线程的优先级。Thread之上的线程模型都不支持优先级设置。设置一个线程的高优先级可以使它获得更多的CPU时间;

再者,可以控制线程为前台线程。当然,由Thread新起的线程默认就是前台线程。前台线程不随着调用者线程的中断而中断,这使得我们可以用Thread来进行一些关键性的操作。

 

12. Java c# .net c++的并发技术

12.1. Java并发编程实战(第16Jolt大奖提名图书,Java并发编程必读佳作

作者:Brian GoetzTim PeierlsJoshua BlochJoseph BowbeerDavid HolmesDoug Lea 著,童云兰 等译

 

 

1章 简介

 第2章 线程安全性

 第3章 对象的共享

 第4章 对象的组合

 第5章 基础构建模块

 第6章 任务执行

 第7章 取消与关闭

 第8章 线程池的使用

 第9章 图形用户界面应用程序

 第10章 避免活跃性危险

 第11章 性能与可伸缩性

 第12章 并发程序的测试

 第13章 显式锁

 第14章 构建自定义的同步工具

 第15章 原子变量与非阻塞同步机制

 第16章 Java内存模型

 

12.2. Java并发技术

Executor框架

13. 22. Java c# .net c++的并发技术7

13.1. 22.1. Java并发编程实战(第16Jolt大奖提名图书,Java并发编程必读佳作 8

13.2. 22.2. Java并发技术 8

13.3. 22.3. C#多线程编程实战( ((美... 8

13.4. 22.4. Line 278:   《C++并发编程实战》 Line 285: 1章 你好,C++并发世界 9

13.5. 22.5. C#并发编程经典实例》 9


原文地址:https://www.cnblogs.com/attilax/p/15197772.html