一、并发基础知识

目录

进程

线程

两者之间的对比

并行和并发

同步和异步

同步阻塞

同步非阻塞

异步阻塞

异步非阻塞 

保护性暂停模式



进程

进程为一个程序的示例,是程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。换句话说,进程就是正在执行的一个程序或应用。  每个进程都有自己的独立内存空间,包含了程序运行所需要的所有资源。进程之间的内存空间是相互隔离的,一个进程不能访问另一个进程的内存空间。  进程可以创建和终止,也可以与其他进程进行通信。操作系统负责管理和调度进程,例如决定哪个进程可以使用CPU,哪个进程需要等待等。  进程中还可以包含多个线程,每个线程是进程中的一个独立执行单元。同一个进程中的所有线程共享该进程的内存空间。、

线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。  线程与传统的理解中的程序或者应用不同,线程不能独立存在,它由进程启动和管理。同一个进程的多个线程之间,可以共享该进程的资源,如内存数据等,这使得线程之间的通信更加方便。  线程相比于进程,具有更小的资源占用,更快的创建和结束速度,以及更高的并发性,因此在需要大量并发操作,或者需要更高效率的场合,会使用多线程编程。

两者之间的对比

进程和线程都是操作系统进行任务调度的单位,但它们之间存在一些关键的区别:  

1. 独立性:进程是系统资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间和系统资源。而线程是进程的一部分,同一进程内的线程共享该进程的资源。  

2. 资源开销:创建或删除进程时,由于需要独立的系统资源,所以开销较大。相比之下,线程的创建和删除只需要在已有进程中分配或回收一些资源,所以开销较小。  

3. 通信方式:进程间通信需要使用操作系统提供的进程间通信机制,如管道、消息队列、信号量等。而线程间可以直接读写同一进程中的数据,通信更加方便。  

4. 可并发性:在多核CPU系统中,多进程和多线程都可以实现并行执行。但在单核CPU系统中,只能使用时间片轮转等技术实现并发执行。  

5. 稳定性:进程间不会互相影响,一个进程崩溃不会影响其他进程。但是一个线程崩溃可能会导致整个进程崩溃。  

总的来说,线程是轻量级的进程,它们是在进程内部运行的并发单位。线程之间的通信更加方便,开销更小,但稳定性不如进程。

并行和并发

并行和并发是计算机科学中两个重要的概念,它们描述的是多个任务如何同时被处理的情况。

 1. 并行(Parallelism):并行是指两个或更多的任务在同一时刻被执行。例如,在多核处理器的系统中,可以有多个任务在不同的处理器核心上同时执行。并行处理可以显著提高系统的处理能力和效率。

 2. 并发(Concurrency):并发是指两个或更多的任务在同一时间间隔内被启动、运行和完成。并发任务之间可能并不是真正同时执行的,例如,在单核处理器的系统中,虽然在任何给定的单一时刻只有一个任务在执行,但是由于任务之间的切换速度非常快,使得人们感觉它们似乎在同时执行。  

简单来说,"并行"强调的是同时执行,"并发"强调的是独立运行。在多核处理器的系统中,可以实现真正的并行。在单核处理器的系统中,通过任务切换可以实现并发。

同步和异步

同步和异步是描述程序执行流程控制方式的两个重要概念:  

1. 同步(Synchronous):在同步操作中,一个任务的完成需要依赖另一个任务。当一个任务在执行时,如果它需要等待另一个任务完成(例如等待I/O操作或者等待其他任务的结果),那么这个任务就会被阻塞,直到它所依赖的任务完成为止。在这种情况下,任务是按照顺序一个接一个执行的。

 2. 异步(Asynchronous):在异步操作中,一个任务的完成不需要依赖另一个任务。当一个任务在执行时,如果它需要等待另一个任务完成,那么这个任务不会被阻塞,而是会继续执行其他任务。当它所依赖的任务完成时,它会接收到一个通知(例如一个回调函数或者一个事件),然后再处理这个任务的结果。在这种情况下,多个任务可以并行执行。  

简单来说,同步意味着一步接一步,而异步意味着不需要等待前一步完成就可以继续下一步。

除此之外还会经常听到一些概念:

同步阻塞

在同步阻塞模式下,一个操作(如I/O操作)在完成之前,当前线程会停止执行,直到这个操作完成。在此期间,CPU不能做其他事情,从而导致CPU资源浪费。

同步非阻塞

在同步非阻塞模式下,一个操作(如I/O操作)在完成之前,当前线程不会停止执行,而是继续执行其他任务。但是,线程需要不断地检查这个操作是否已经完成,这就是所谓的轮询,这种方式会占用大量CPU资源。

异步阻塞

这是一种比较少见的模式,通常不会在实际开发中使用。在异步阻塞模式下,一个操作(如I/O操作)在完成之前,当前线程会停止执行,当操作完成时,线程会收到一个通知。但是,在等待操作完成的过程中,线程是被阻塞的。

异步非阻塞 

 异步非阻塞:在异步非阻塞模式下,一个操作(如I/O操作)在完成之前,当前线程不会停止执行,而是继续执行其他任务。当操作完成时,线程会收到一个通知。这种方式既不会浪费CPU资源,也不会阻塞线程,因此在实际开发中使用最广泛。

保护性暂停模式

保护性暂停(Guarded Suspension)是一种并发设计模式,用于处理一个线程需要等待另一个线程的结果的情况。

在这种模式中,一个线程执行某个操作并等待结果,而这个结果需要由另一个线程提供。如果结果还没有准备好,那么等待结果的线程就会暂停执行(通常是通过等待/通知机制实现),直到结果准备好为止。  

这种模式可以确保线程在继续执行之前,所需要的条件已经满足。这就是为什么它被称为“保护性暂停”。

利用wait-notify实现保护性暂停模式,详情四、wait-notifys-CSDN博客

class GuardedObject {
    private Object response;
    public synchronized Object get() {
        while (response == null) { //注意此地用的是while,而不是if
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return response;
    }

    public synchronized void complete(Object response) {
        this.response = response;
        notifyAll();
    }
}

 除此之外,很多地方都采用了这样的模式,例如BlockingQueue,FutureTask。

你可能感兴趣的:(并发编程,java)