并发编程常见的概念
一:线程和进程
进程:
并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
线程:
是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。
线程与进程:
线程和进程的实现在操作系统之间有所不同,但在大多数情况下,线程是进程的一个组件
。多个线程可以存在于一个进程中
,并发执行和共享资源(如内存)
,而不同的进程不共享这些资源
。特别是,进程的线程共享其可执行代码及其值在任何给定时间动态分配变量和非线程局部 全局变量
。如图:
二:同步和异步
同步和异步通常用来形容一次方法调用。`同步方法调用:`调用者必须等到方法调用返回后,才能继续后续的行为。
异步方法调用:
像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作。
三:并发和并行
并发和并行都可以用来表示两个或者多个任务一起执行,但是侧重点不一样。
并发:
多个任务交替执行,并且多个任务之间也有可能是串行的。
并行:
真正的同时执行**。**
如图所示:
这一张是并行的图,我们发现纵坐标某一时刻只有一个任务是在执行的,CPU在不断的切换线程,以极快的速度给人感觉是同时在执行。
而第二张图,则完美诠释了线程A、B、C同一时刻同时执行。
四:临界区
临界区
通常指共享数据,可以被多个线程使用。当有线程进入到临界区时候,其他线程或者进程必须等待。
比如这样一个程序片段:
public class demo{
private int age;
public void setAge(){
// 临界区
synchronized{
age++;
}
}
}
很明显age就是一个临界区。不同的线程同时对其操作必然会破坏age的真实输出,必须要对其进行保护,这里使用的是synchronized关键字,后面会具体讲。同时只有一个线程能进行age++操作。