【专家坐堂】四种并发编程模型简介

本文介绍了四种常见的并发编程模型:多线程、回调、Actor和CSP,帮助开发者理解并发编程的概念和优势。多线程模型易于编写但难以分析,回调模型可能导致回调地狱,Actor模型通过消息传递实现并发,而CSP则通过通道进行同步通信。每种模型都有其适用场景,理解它们有助于选择合适的并发编程方法。
摘要由CSDN通过智能技术生成

本文来自网易云社区

概述

并发往往和并行一起被提及,但是我们应该明确的是“并发”不等同于“并行”

•       并发 :同一时间 对待 多件事情 (逻辑层面)

•       并行 :同一时间 做(执行) 多件事情 (物理层面)

并发可以构造出一种问题解决方法,该方法能够被用于并行化,从而让原本只能串行处理的事务并行化,更好地发挥出当前多核CPU,分布式集群的能力。

但是,并发编程和人们正常的思维方式是不一样的,因此才有了各种编程模型的抽象来帮助我们更方便,更不容易出错的方式构建并发程序。下面将简单介绍一些常见的并发编程模型,希望能帮助大家对并发编程有更多的兴趣。这些模型都有各自的优势,需要根据应用场景挑选,而挑选的前提是能够深入地理解它们。

多线程编程模型

多线程模型是用于处理并发的最通用手段,在 C/C++/JAVA 等语言中广泛存在。主要特性有:

l  多个相互独立的执行流.

l  共享内存(状态).

l  抢占式的调度.

l  依赖锁,信号量等同步机制

多线程程序容易编写(因为写的是顺序程序),但是难分析,难调试,更容易出错,常见的有竞争条件,死锁,活锁,资源耗尽,优先级反转… 等等。

为了降低多线程模型编写难度,很多语言都一直在不断地引入并发编程方面新的特性,例如Java。从最早1996年的JDK1.0 版本起就已经有了Thread,Runnable类,确立了最基础的线程模型,这已经比直接调用POSIX接口构建多线程应用的方式有了很大的提高。然后在JDK5时引入了java.util.concurrent包,其中的线程池(Thread Pool,Executors)等类库,使得Java并发编程的易用性有了更好的提升。

到了JDK7, Fork/Join框架被引入,虽然底层一样是基于ExecutorService线程池的实现。但在编写并发逻辑时会比传统多线程方式更加直观,开发者可以将一个大的作业抽象为几个可以并发的子任务的结果整合;而每个子任务又可以继续按此逻辑继续划分,充分发挥现代多核CPU的性能。

201808281434597a49586d-7e40-427a-a954-0ab922bec249.png

同时,Fork/Join框架中还内置了Work-Stealing的任务调度机制,能够在尽量降低线程竞争的同时尝试自动均衡各工作线程之间的任务负载。如下图所示: 

20180828143656b5a7f8c0-7b7c-4c27-b0b7-bc221f5033c4.png


Ø  4个线程每个都有独立的工作队列,避免单任务队列竞争

Ø  队列中的任务采用类似LIFO方式进出。由于整体作业都是按照一个大任务fork出多个子任务来抽象,因此可以视为越大粒度的任务会沉在队列的越底部。

Ø  当某个线程(示例中为线程D)的工作队列为空时,该线程就会自动尝试从另一个线程(示例中为线程A)的队列底部”偷“一个任务过来执行。由于是从底部窃取的任务,可以假设这个任务将展开更多的子任务,从而减少窃取动作的产生,降

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值