并发编程
什么是并发编程
并发意味着多个运算同时发生:在现代编程中并发到处都是:
- 网络上的多个计算机
- 在一个计算机上运行的多个程序
- 一个计算机上的多个进程
并发在现代编程中十分关键:
-
网站必须解决多个同时的用户
-
移动app需要在服务器上处理他们的进程(云处理)
-
图形用户界面几乎总是需要不会中断用户的后台工作。
为什么并发?
-
处理器始终速度不断增加
-
新一代的芯片都会由很多内核
-
为了让计算更快运行
两种常见的并发模型
共享内存和消息传递
共享内存
- 共享内存:在共享内存的并发模式中,并发模式通过在内存中的共享对象完成读写交互:
共享内存模型的例子:
-A和B 可能是在同一个计算机的两个进程,共享着相同的物理内存
A和B 可能是在一个计算机上运行的两个程序,共享着它们可以读写的相同的文件系统。
A和B可能在一个Java程序中的两个线程,共享这相同的Java对象
传递信息
- 传递信息:在纤细传递模型中并发模型通过在信息通道相互传递信息交互。模型向每个模型发出信号,和每个模块的传入消息列队等待处理
传递信息的例子:
A和B 可能是网络中的两台计算机,通过网络连接通信;
A和B 可能是一个网络浏览器和一个网络服务器,A 向B 发起一个连接,并且向B请求一个网页,并且B 送回网页数据给A
A和B 可能是一个即时消息的客户端和服务器
进程、线程、时间分片
进程和线程
传递信息和共享内存模型是有关于并发模型如何通信的
并发模型本身可以被分为两个不同的类型:
进程和线程,两种执行(execution)基本单元
一个进程是运行程序的一个实例,拥有自己私有的专用的内存空间
线程是正在运行该程序的一个执行路径(一个进程对应多个线程),线程由自己的堆栈和局部变量,但是多个线程共享内存空间
进程
进程抽象是一个虚拟计算机,拥有独立的执行环境和完整的资源
它让程序感到好像在独占整个机器,想是一个拥有全新内存的,全新的计算机被创造为了运行那个程序
就像网络连接的电脑,进程通常不共享内存。
一个进程不能访问其他进程的内存或者对象
进程间的共享内存在绝大多数操作系统上都是可能的,但是它需要特殊的机制
相反的,一个新进程自动地准备好传递信息,因为他是被标准I&O流(standard input & output streams)创建的.(在Java中的System.out 和 System.in)
进程经常都会被看作和程序或者应用(app)同义。但是,应用程序实际上可能是一组协作进程。为了实现进程间的通信,绝大多数操作系统支持进程间通信(IPC,Inter Process Communication)资源,例如pipe和socket(IPC不仅仅是适用于同一个系统上的进程间通信,同时也适用于不同系统上的进程)
进程
就像一个进程代表着一个虚拟计算机,进程可抽象为一个虚拟处理器,线程有时也被称为轻量级进程。
创建一个新线程模拟创建在进程所代表的虚拟计算机中的一个全新的处理器
这个新的虚拟处理器和其他在进程中的线程,运行相同的程序,并且共享相同的资源(内存,打开的文件,等等)
线程是自动准备共享内存的,因为线程在进程之中共享内存。
它致力于获取进程私有的局部线程内存(”thread-local” memory)。
通过创建和使用队列数据结构来显式创建信息传递也是关键的
线程需要特殊处理才能实现消息传递和访问私有内存。
线程是轻量级的 | 进程是重量级的 |
---|---|
线程共享内存空间 | 进程有自己的地址 |
线程需要同步 | 进程不需要 |
关掉线程不安全 | 关掉进程是安全的 |
在JAVA中的并发
在java中,线程是生活的现实,例如GC(garbage collector)在它所有的线程中运行
为了利用多多核处理器,必须编写多线程代码
好消息是:Java提供了并发编程的库函数(java.util.concurrent)
坏消息是:你得理解基本概念
多线程执行是JAVA程式语言平台的一个重要特征
每个程序至少有一个线程
从程序员的角度来看,main线程是开始线程,可以同过它创建其他的线程
创建一个线程的两种方法:1.创建thread类的子类。2.实现runnable接口,作为参数传递给new Thread构造函数
所有的线程都需要实现runnable接口,并实现run()方法
Runnable接口表示着一个线程要去做的任务
public
interface Runnable {
void run();
}