并发编程简介

与串行程序开发相比,并发编程的难度更大,编写、调试、维护都很困难,导致很多开发人员图省事放弃并发编程。但是现在已经进入了多核移动互联时代,现在连入门级的手机都是多核的,所以如何充分发挥多核处理器系统的强大的计算能力,是我们每个开发人员需要面对的。

一、并发的历史

1.串行时代

串行执行的特点

每次只能运行一个程序,只有其执行完成其他程序才能开始执行。

这种方式人类流水线的工作方式,其优势在于直观性和简单性。

串行执行的缺点

资源利用率低,单个程序执行不能有效率用cpu资源,尤其是其进行长时间IO操作的情况下。

缺乏公平性,不同用户和计算机不能同等的使用计算机资源。

缺乏灵活性,一个复杂的业务系统需要完成多个大的任务,往往需要垂直切分为多个业务系统更好实现。

2.进程时代

我们发现生活中人们总是可以在串行和异步之间进行并行权衡达到优雅高效做事。例如人们往往在煮粥的同时,可以摘菜、洗菜、切菜,待菜准备好的时候,可能粥也就煮好了,这时候正好可以炒菜。

所以为了解决串行编程的缺点,操作系统出现了。

进程执行的特点

可以同时执行多个程序,但是每个程序在单独的进行中执行。

每个进程分配单独的资源,例如内存、文件句柄等。

不同进程之间可以通过套接字、信号量等进行交换数据。

3.线程时代

线程执行的特点

线程共享父进程内的资源,例如内存句柄、文件句柄等,需要同步共享数据的访问,防止发生不可预测的结果。

每个线程都有自己的程序计数器、堆栈、局部变量等。

现代操作系统以线程为基本调度单位,线程可以不同的cpu上进行调度执行。

二、线程的优势

1.充分利用多(核)处理器的计算能力。

随着移动设备的普及,多核设备随处可见,多线程程序可以提高处理器的资源利用率。

即使多线程在单处理器上也可以通过异步提高IO密集型操作的性能。

2.建模简单

一个程序往往会包含很多不同类型的任务,很多时候往往可以为不同的任务分配不同的线程进行处理。比如在ASP.NET中,每个请求都是由某个线程处理的,同时GC在另外的线程上负责垃圾回收。

3.简化异步处理

web服务器接受客户端请求,如果为每个链接分配线程并使用同步IO,这样会严重降低并发能力。

单线程是很难实现异步IO的,通过多线程可以很方便的实现同时处理大量的IO请求。

4.UI界面响应更友好

UI界面往往在单独的线程中执行,代码逻辑在另外的线程中运行。

三、多线程的风险

1.安全性问题

由于线程执行顺序的不可预测性,如果没有进行充足同步的情况下,往往会由于对共享数据的无序操作,导致不可预知的结果。比如对共享数据value的访问,可能会导致多个线程获取到相同的value。

2.活跃性问题

活跃性问题往往是为了保证数据的安全性问题,对线程的执行顺序加以限制,从而导致活跃性的问题,比如死锁、饥饿、活锁等。

3.性能问题

活跃性问题会导致性能问题;

多线程需要运行时开销,例如上下文切换、数据同步机制导致缓存失效和编译器优化失效。

时间: 2024-10-09 07:07:15

并发编程简介的相关文章

c#并发编程经典实例文摘

第1章 并发编程概述 1.1 并发编程简介 并发: 多线程(包括并行处理) 异步编程(异步操作)程序启动一个操作,而该操作将会在一段时间后完成 响应时编程(异步事件)可以没有一个实际的开始,可以在任何时间发生,并且可以发生多次

Scala入门到精通——第二十六节 Scala并发编程基础

作者:摇摆少年梦 视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 Scala并发编程简介 Scala Actor并发编程模型 react模型 Actor的几种状态 Actor深入使用解析 本节主要介绍的scala并发编程的基本思想,由于scala在2.10版本之后宣布使用akka作为其并发编程库,因此本节只进行基础性的内容介绍,后面将把重点放在akka框架的讲解上. 1. Scala并发编程简介 2003 年,Herb Sutter 在他的文章 "

Java并发编程(01):线程的创建方式,状态周期管理

本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序,关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. 线程 线程是操作系统能够进行运算调度的最小单

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

本文来自网易云社区 概述 并发往往和并行一起被提及,但是我们应该明确的是"并发"不等同于"并行" ?       并发 :同一时间 对待 多件事情 (逻辑层面) ?       并行 :同一时间 做(执行) 多件事情 (物理层面) 并发可以构造出一种问题解决方法,该方法能够被用于并行化,从而让原本只能串行处理的事务并行化,更好地发挥出当前多核CPU,分布式集群的能力. 但是,并发编程和人们正常的思维方式是不一样的,因此才有了各种编程模型的抽象来帮助我们更方便,更不容

《Java并发编程实战》读书笔记(一)----- 简介

简史 早期的计算机中不包含操作系统,从头至尾都只执行一个程序,并且这个程序能访问计算机所有资源.随着计算机发展,操作系统的出现,使得计算机可以同时运行多个程序,并且每程序都在单独的进程内运行.为什么要这么做呢?主要基于以下原因: 1.资源利用率 程序在等待时计算机可以执行另一个程序,同一个资源可以被不同程序使用,这无疑提高了资源的利用率.2.公平性 不同的用户与程序对计算机有相同的使用权,通过时间分片每个程序共享资源,而不是等待上一个程序运行结束再启动下一个程序.3.便利性 每个程序单独运行,必

[Java 并发] Java并发编程实践 思维导图 - 第一章 简介

阅读<Java并发编程实践>一书后整理的思维导图.

漫谈并发编程(一) - 并发简介

并发编程是每个程序员进阶的必修之课,想写一个安全稳定,性能强劲的并发程序可没那么容易.我将在未来的日子里,与大家分享一个并发小白成长路上的所思所想.并发编程的思想是通的,但是例子得要是具现的,在该系列中将使用java语言用以演示. 此文作为为漫谈并发编程系列的第一篇,由于本人喜欢先论理再论事,而非先论事再论理,所以就以一篇对并发的文字描述开头了. 并发编程由来 早年的计算机中没有操作系统,在某个时间段内只支持运行一个程序,并且这个程序能访问计算机的所有资源.在这个程序完全执行完后,再执行下一个程

[笔记][Java7并发编程实战手册]3.2 资源的并发访问控制Semaphore信号量

[笔记][Java7并发编程实战手册]系列目录 简介 本文学习信号量Semaphore机制. Semaphore 本质是一个共享锁 内部维护一个可用的信号集,获取信号量之前需要先申请获取信号数量:用完之后,则需要释放信号量:如果不释放,那么其他等待线程则一直阻塞直到获取信号量或则被中断为止 本人的理解是:互斥锁是同一时间只能一个线程访问,而在这里,是同一时间允许获取到了信号量的线程并发访问,而没有获取到信号量的则必须等待信号量的释放: 将信号量初始化为 1,使得它在使用时最多只有一个可用的许可,

[笔记][Java7并发编程实战手册]4.3 创建固定的线程执行器newFixedThreadPool线程池

[笔记][Java7并发编程实战手册]系列目录 简介 newFixedThreadPool(int nThreads, ThreadFactory threadFactory) 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,在需要时使用提供的 ThreadFactory 创建新线程. newCachedThreadPool()创建的线程池的特性是:自动回收不使用的线程(终止并从缓存中移除那些已有 60 秒钟未被使用的线程),(在无可用线程的情况下)自动的为新来的task创