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. 5,Actor模型 9

11. Qa 9

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

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

12.2. Java并发技术 11

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

13.1. 22.1. Java并发编程实战(第16届Jolt大奖提名图书,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中的本质,本质都是多线程。

异步,简单的讲就是BeginInvoke、EndInvoke模式,它在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

ThreadPool(BackgroundWorker,Timer)

异步

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. 5,Actor模型

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

 

 

11. Qa

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

这需要从“IO操作的DMA(Direct 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并发编程实战(第16届Jolt大奖提名图书,Java并发编程必读佳作

作者:Brian Goetz,Tim Peierls,Joshua Bloch,Joseph Bowbeer,David Holmes,Doug 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并发编程实战(第16届Jolt大奖提名图书,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

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

  1. oracle rac 高并发性能_Tomcat 高并发之道原理拆解与性能调优

    高并发拆解核心准备 这回,再次拆解,专注 Tomcat 高并发设计之道与性能调优,让大家对整个架构有更高层次的了解与感悟.其中设计的每个组件思路都是将 Java 面向对象.面向接口.如何封装变与不变, ...

  2. Atitit 算法之道 attilax著 1. 编码算法 3 1.1. Base64 htmlencode urlencode 3 2. Ui方面的算法 3 2.1. 软键盘算法 计算软键盘上下

    Atitit 算法之道 attilax著 1. 编码算法 3 1.1. Base64 htmlencode  urlencode 3 2. Ui方面的算法 3 2.1. 软键盘算法  计算软键盘上下左 ...

  3. 《FPGA并行编程》读书笔记专栏启动说明

    <FPGA并行编程>读书笔记专栏启动说明 1. <FPGA并行编程>内容简介 2. 专栏内容简介 3. 开启专栏目的 4. 专栏内容安排 5. 专栏时间安排 6. 相关资料下载 ...

  4. 如何运用并行编程Parallel提升任务执行效率

    本文来自小易,[DoTNET技术圈]公众号已获得转载授权. <.NET并发变成实战>读后感:并行编程Parallel 手打目录: 一.前言 二.任务并行库(TPL)的介绍 三.Parall ...

  5. .NET 4 并行(多核)编程系列之一入门介绍

    .NET 4 并行(多核)编程系列之一入门介绍 本系列文章将会对.NET 4中的并行编程技术(也称之为多核编程技术)以及应用作全面的介绍. 本篇文章的议题如下:   1. 并行编程和多线程编程的区别. ...

  6. .Net并行编程系列文章导航

    .Net4.0并行编程系列文章如下: 多核时代 .NET Framework 4 中的并行编程9---线程安全集合类 多核时代 .NET Framework 4 中的并行编程8---任务的同步 多核时 ...

  7. 深入理解并行编程pdf

    下载地址:网盘下载 <深入理解并行编程>首先以霍金提出的两个理论物理限制为引子,解释了多核并行计算兴起的原因,并从硬件的角度阐述并行编程的难题.接着,<深入理解并行编程>以常见 ...

  8. 并行编程1——什么是并行程序?

    首先了解几个概念 1. 串行 最基本的程序执行方式,串行程序的整个运行时,只有一个调用栈和一个运行时上下文. 2. 并发 多线程出现后比较常见的程序执行方式,多线程程序运行时,会有多个运行时上下文和对 ...

  9. 浅谈并行编程中的任务分解模式

     并行编程使用线程来使得多个操作能够同时运行.并行编程主要包括应用程序中线程设计,开发和部署以及线程间相互协调和各自的操作. 在下文中我们将讨论怎样分割适合线程化大小的编程任务来多任务化一个应用程 ...

  10. Atitit s2018 s4 doc list dvchomepc dvccompc.docx .docx \s2018 s4 doc compc dtS44 \s2018 s4 doc dvc

    Atitit s2018 s4 doc list dvchomepc dvccompc.docx .docx \s2018 s4 doc compc dtS44 \s2018 s4 doc dvcCo ...

最新文章

  1. 安卓开发 高德地图 marker 点击移动位置_高德手机AR导航再升级,有惊喜
  2. Douglas-Peucker算法
  3. python基础教程学习笔记十二
  4. 【数学基础】一份非常适合人工智能学习的概率论基础材料中文版 (CS229概率论)...
  5. wxWidgets:wxLayoutAlgorithm类用法
  6. 在猜年龄的基础上编写登录、注册方法,并且把猜年龄游戏分函数处理
  7. Java多线程(五)之BlockingQueue深入分析
  8. 聊聊如何构建一支自驱团队(二)
  9. 分支语句复习 java 9018
  10. Python 数据结构与算法 —— Kruskal 算法
  11. IntelliJ IDEA导入maven项目
  12. 客快物流大数据项目(一):物流项目介绍和内容大纲
  13. 安装office2010提示错误25541的解决方法
  14. Illegal group reference:非法组引用异常
  15. 利用OPNET进行网络单播(一服务器多客户端)仿真的设计、配置及注意点
  16. 机器学习中的线性代数之矩阵求导
  17. 模拟SPI驱动SD卡
  18. dct变换可以用什么方法代替_「dct变换」DCT变换自学笔记 - seo实验室
  19. PLSQL Developer 登录报错 initialization error
  20. 贝叶斯学习、MAP、ML

热门文章

  1. thymeleaf 判断对象是否为空_JVM面试问题系列:判断对象是否已死和四种垃圾回收算法总结...
  2. Ubuntu修改open files数
  3. 开源中国 OsChina Android 客户端源码分析(12)清理缓存
  4. 关于C#中Thread.Join()的一点理解
  5. 坐标字符NYOJ 298 点的变换 (矩阵快速幂)
  6. 基于OpenCV实现二值图细化,骨骼化并求出端点和交叉点
  7. Postgresql 创建主键并设置自动递增的三种方法
  8. 第四章 MyBatis-SQL映射文件
  9. 并发编程: 生产消费模型、死锁与Rlock、线程、守护线程、信号量、锁
  10. android注解处理技术APT