Skip to content

基本概念

更新: 1/19/2026 字数: 0 字 时长: 0 分钟

JUC 是 java.util.concurrent 包的缩写,是 Java 并发编程的核心工具包。它提供了一系列用于处理多线程编程的类和接口,旨在简化并发编程的复杂性,提高程序性能和可靠性。

https://www.bilibili.com/video/BV16J411h7Rd

线程与进程

进程:程序是静止的,进程实体的运行过程就是进程,是系统进行资源分配的基本单位

线程:线程是属于进程的,是一个基本的 CPU 执行单元,是程序执行流的最小单元。线程是进程中的一个实体,是系统独立调度的基本单位,线程本身不拥有系统资源,只拥有一点在运行中必不可少的资源,与同属一个进程的其他线程共享进程所拥有的全部资源

关系:一个进程可以包含多个线程,这就是多线程,比如看视频是进程,图画、声音、广告等就是多个线程

线程的作用:使多道程序更好的并发执行,提高资源利用率和系统吞吐量,增强操作系统的并发性能

线程与进程对比

  • 进程基本上相互独立的,而线程存在于进程内,是进程的一个子集

  • 进程拥有共享的资源,如内存空间等,供其内部的线程共享

  • 进程间通信较为复杂

    同一台计算机的进程通信称为 IPC(Inter-process communication)

    • 信号量:信号量是一个计数器,用于多进程对共享数据的访问,解决同步相关的问题并避免竞争条件
    • 共享存储:多个进程可以访问同一块内存空间,需要使用信号量用来同步对共享存储的访问
    • 管道通信:管道是用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件 pipe 文件,该文件同一时间只允许一个进程访问,所以只支持半双工通信
      • 匿名管道(Pipes):用于具有亲缘关系的父子进程间或者兄弟进程之间的通信
      • 命名管道(Names Pipes):以磁盘文件的方式存在,可以实现本机任意两个进程通信,遵循 FIFO
    • 消息队列:内核中存储消息的链表,由消息队列标识符标识,能在不同进程之间提供全双工通信,对比管道:
      • 匿名管道存在于内存中的文件;命名管道存在于实际的磁盘介质或者文件系统;消息队列存放在内核中,只有在内核重启(操作系统重启)或者显示地删除一个消息队列时,该消息队列才被真正删除
      • 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收

    不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如 HTTP

    • 套接字:与其它通信机制不同的是,可用于不同机器间的互相通信
  • 线程通信相对简单,因为线程之间共享进程内的内存,一个例子是多个线程可以访问同一个共享变量

    Java 中的通信机制:volatile、等待/通知机制、join 方式、InheritableThreadLocal、MappedByteBuffer

  • 线程更轻量,线程上下文切换成本一般上要比进程上下文切换低

并发与并行

单核 CPU 下,线程实际还是串行执行的。

操作系统中有一个组件叫做任务调度器,将 CPU 的时间片(Windows 下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 CPU 在线程间(时间片很短)的切换非常快,人类感觉是同时运行的。

总结为一句话就是:微观串行,宏观并行,一般会将这种线程轮流使用 CPU 的做法称为并发(concurrent)

  • 并发:在同一时刻,有多个指令在单个 CPU 上交替执行
  • 并行:在同一时刻,有多个指令在多个 CPU 上同时执行

并发(concurrent)是同一时间应对(dealing with)多件事情的能力

并行(parallel)是同一时间动手做(doing)多件事情的能力

同步与异步

  • 需要等待结果返回,才能继续运行就是同步
  • 不需要等待结果返回,就能继续运行就是异步

阻塞与非阻塞

  • 阻塞是指程序在执行某个操作时会暂停,必须等待该操作彻底完成后才能继续执行后续代码,就像原地不动地等待结果。
  • 非阻塞是指程序在执行操作时会立即返回,不等待结果,而是继续处理其他任务,稍后通过轮询或事件通知来获取操作结果。

贡献者

The avatar of contributor named as LI SIR LI SIR

页面历史