并发总结

本文介绍了并发的概念,包括并发与并行的区别,并探讨了为何存在并发。接着,文章详细讨论了并发的实现方式,包括线程与锁模型,如互斥同步(悲观锁与乐观锁)、无锁以及Java的并发优化技术。此外,还介绍了事件驱动模型,如Node.js的异步回调、CSP(通信顺序进程)和Actor模型,如Erlang OTP、Akka以及Go的Goroutine。并发编程模型各有优缺点,选择合适的模型能有效提高系统性能和容错能力。
摘要由CSDN通过智能技术生成

1、并发是什么?

先说明一下什么是并发、什么是并行。
- 并发(concurrency) 并发的关注点在于任务切分。举例来说,你是一个创业公司的CEO,开始只有你一个人,你一人分饰多角,一会做产品规划,一会写代码,一会见客户,虽然你不能见客户的同时写代码,但由于你切分了任务,分配了时间片,表现出来好像是多个任务一起在执行。
- 并行(parallelism) 并行的关注点在于同时执行。还是上面的例子,你发现你自己太忙了,时间分配不过来,于是请了工程师,产品经理,市场总监,各司一职,这时候多个任务可以同时执行了。

这个世界本来就充斥的大量的并发&并行模型,所以并发&并行只是真实世界的客观抽象和反应。
在计算机世界里,更强调的是CPU的工作模式。并发并不要求必须并行,可以用时间片切分的方式模拟,比如单核cpu上的多任务系统,并发的要求是任务能切分成独立执行的片段。而并行关注的是同时执行,必须是多(核)cpu,要能并行的程序必须是支持并发的。但是大多数情况下不会严格区分这两个概念,默认并发就是指并行机制下的并发。

2、为什么会存在并发?

理论上一个CPU只干一个任务,不来回切换,效率会更高;但是为什么不这样呢,个人理解是CPU工作快(可以切换支持多个任务),CPU贵(安装太多无浪费),任务多(不可能达到一个CPU一个任务)。所以就存在一个CPU切换做多个任务的情况。同时,CPU相较于内存、磁盘、网络等运行速度快,因为与内存等交互,经常存在等待内存、等待网络、等待磁盘等情况;所以出现了在等待的同时,切换到别的等待计算任务工作的场景。通过压榨CPU(提高资源利用率)来支持并发任务。
举个列子:web用户A在登录、用户B在访问数据、用户C在修改数据,后台的web服务中就通过CPU切换并发支持三个用户(QPS是衡量服务性能的重要指标),否则会出现A用户操作,B、C用户的等待的情况。
并发的目的是及时响应、高效(分布式)、容错(比串行处理粒度细)、简单(比串行方案简单)。但是个人理解,根本是为了支持客观业务需求(也引导业务发展?)。

3、并发是怎么实现的?

先来看一句话:之所以写正确的并发、容错、可扩展的程序如此之难,是因为我们用了错误的工具和错误的抽象(Akka官方文档开篇)。我们抽取一点,并发是困难的,至于AKKA是否的正确的工具咱不讨论。并发系统是经典的困难,因为没有顺序能够保证内存突变(程序员无法通过代码指定线程执行顺序,因为线程只听命于CPU调度),告诉哪些线程可能会执行一个给定的一段代码不可避免地变得很难。由于并发马虎出现的错误是出了名的难以解决,这些都是由于线程调度的不可预测性。那么并发是怎么实现的呢?

3.1 线程与锁模型

是一种经典的解决方案。
线程的使用比较简单,如果你觉得这块代码需要并发,就把它放在单独的线程里执行,由系统负责调度,具体什么时候使用线程,要用多少个线程,由调用方决定。但是现实世界是复杂的,总有一些资源需要在不同的线程中共享。比如前面的例子,开发人员和市场人员同时需要和CEO商量一个方案,这时候CEO就成了竞态条件。如果要得到正确的使用,则引入了锁。

  • 线程(Thread)是操作系统能够进行运算调度的最小单位。是更轻量的进程,由系统内核进行调度,同一进程的多个线程可共享资源。
  • 竞态条件(race conditions),从多进程间通信的角度来讲,是
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值