一文讲明白 Java 中线程与进程、并发与与并行、同步与异步
写在开头
ok,everybody,在过去的两周内,我们大体上讲完了 Java 的集合,在最后我们探讨了关于 HashMap 线程不安全的原因,又提出了 ConcurrentHashMap 这个线程安全的集合解决方案,那么在接下来的 2-3 周内,我们就一起来学习一下 Java 中的并发多线程。在开始学习之前,我们必须要搞清楚几个概念:线程与进程、并发与并行、同步与异步。
线程与进程
Java 的并发指的是多线程,而与多线程对应的有个进程的概念,啥是进程呢?我们通过CTRL+SHIFT+ESC
组合快捷键打开电脑的任务管理器,我们就看到了如下的这幅图。
这里面执行的每一条就是一个进程,它是程序执行时的一个实例,操作系统会为每个进程分配独立的内存地址空间,因此,进程也是系统进行资源分配和调度的基本单位。
而线程是比进程更小的执行单位,是进程的子任务,因此它本身不会独立存在,系统不会为线程分配内存,线程组之间只能共享所属进程的资源,而线程仅仅是 CPU 调度和分派的基本单位,当前线程 CPU 时间片用完后,会让出 CPU 等下次轮到自己时候在执行。
进程与线程的关系
一个程序至少一个进程,一个进程至少一个线程,进程中的多个线程是共享进程的资源(堆,字符串常量池(JDK1.8)/方法区(JDK1.7));
一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器,栈区域;
Java 中当我们启动 main 函数时候就启动了一个 JVM 的进程,而 main 函数所在线程就是这个进程中的一个线程,也叫做主线程。 我们通过 JMX(Java Management Extensions)管理器去监控一下 JVM,看下面这段代码示例:【代码示例 1】
输出:
由此可见一个 JVM 进程在运行时,包含了很多个子线程。
并发与并行
并行: 指两个或两个以上事件或活动在同一时刻发生。如多个任务在多个 CPU 或 CPU 的多个核上同时执行,不存在 CPU 资源的竞争、等待行为。
并发: 并发指在某时刻只有一个事件在发生,某个时间段内由于 CPU 交替执行,可以发生多个事件,存在对 CPU 资源进行抢占。
同步与异步
同步: 发出一个调用之后,在没有得到结果之前, 该调用就不可以返回,一直等待。
异步: 调用在发出之后,不用等待返回结果,该调用直接返回。
文章转载自:JavaBuild
评论