并发编程简介web
与串行程序开发相比,并发编程的难度更大,编写、调试、维护都很困难,致使不少开发人员图省事放弃并发编程。可是如今已经进入了多核移动互联时代,如今连入门级的手机都是多核的,因此如何充分发挥多核处理器系统的强大的计算能力,是咱们每一个开发人员须要面对的。编程
1、并发的历史缓存
1.串行时代安全
串行执行的特色服务器
每次只能运行一个程序,只有其执行完成其余程序才能开始执行。多线程
这种方式人类流水线的工做方式,其优点在于直观性和简单性。并发
串行执行的缺点异步
资源利用率低,单个程序执行不能有效率用cpu资源,尤为是其进行长时间IO操做的状况下。性能
缺少公平性,不一样用户和计算机不能同等的使用计算机资源。优化
缺少灵活性,一个复杂的业务系统须要完成多个大的任务,每每须要垂直切分为多个业务系统更好实现。
2.进程时代
咱们发现生活中人们老是能够在串行和异步之间进行并行权衡达到优雅高效作事。例如人们每每在煮粥的同时,能够摘菜、洗菜、切菜,待菜准备好的时候,可能粥也就煮好了,这时候正好能够炒菜。
因此为了解决串行编程的缺点,操做系统出现了。
进程执行的特色
能够同时执行多个程序,可是每一个程序在单独的进行中执行。
每一个进程分配单独的资源,例如内存、文件句柄等。
不一样进程之间能够经过套接字、信号量等进行交换数据。
3.线程时代
线程执行的特色
线程共享父进程内的资源,例如内存句柄、文件句柄等,须要同步共享数据的访问,防止发生不可预测的结果。
每一个线程都有本身的程序计数器、堆栈、局部变量等。
现代操做系统以线程为基本调度单位,线程能够不一样的cpu上进行调度执行。
2、线程的优点
1.充分利用多(核)处理器的计算能力。
随着移动设备的普及,多核设备随处可见,多线程程序能够提升处理器的资源利用率。
即便多线程在单处理器上也能够经过异步提升IO密集型操做的性能。
2.建模简单
一个程序每每会包含不少不一样类型的任务,不少时候每每能够为不一样的任务分配不一样的线程进行处理。好比在ASP.NET中,每一个请求都是由某个线程处理的,同时GC在另外的线程上负责垃圾回收。
3.简化异步处理
web服务器接受客户端请求,若是为每一个连接分配线程并使用同步IO,这样会严重下降并发能力。
单线程是很难实现异步IO的,经过多线程能够很方便的实现同时处理大量的IO请求。
4.UI界面响应更友好
UI界面每每在单独的线程中执行,代码逻辑在另外的线程中运行。
3、多线程的风险
1.安全性问题
因为线程执行顺序的不可预测性,若是没有进行充足同步的状况下,每每会因为对共享数据的无序操做,致使不可预知的结果。好比对共享数据value的访问,可能会致使多个线程获取到相同的value。
2.活跃性问题
活跃性问题每每是为了保证数据的安全性问题,对线程的执行顺序加以限制,从而致使活跃性的问题,好比死锁、饥饿、活锁等。
3.性能问题
活跃性问题会致使性能问题;
多线程须要运行时开销,例如上下文切换、数据同步机制致使缓存失效和编译器优化失效。