Java并发基础

本文介绍了Java并发编程的基础知识,包括进程的定义、线程的概念及其在Java中的实现,详细讲解了超线程技术的工作原理。同时,探讨了协程在Java中的应用以及进程与线程的区别。文章还深入讨论了并行与并发的差异,同步与异步,以及阻塞与非阻塞的概念,并通过生动的例子进行解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、进程

  • 程序由指令和数据组成,指令需要加载至CPU,数据需要加载至内存,指令运行也需要网络、磁盘等设备,而进程就是用来加载指令、管理内存、管理IO。进程可以理解为程序的执行过程,是动态

二、线程

  • 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU运行
    Java中,线程作为最小调度单位(CPU找指令),进程作为资源分配的最小单位(加载指令、管理内存、管理IO)
  • 每个线程都有自己的线程栈,自己的寄存器环境,自己的线程本地存储。JVM启动时会创建一个主线程,该主线程负责执行main方法

2.1 超线程技术(引申)

  • 利用特殊的硬件指令,把一个物理核模拟成两个逻辑核,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高了CPU的运行速度。虽然采用超线程技术能同时执行两个线程,但它并不像两个真正的CPU那样,每个CPU都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗CPU的性能

三、协程

  • 协程 (纤程,用户级线程),目的是为了追求最大力度的发挥硬件性能和提升软件的速度
  • 协程基本原理:在某个点挂起当前的任务,并且保存栈信息,去执行另一个任务;等完成或达到某个条件时,再还原原来的栈信息并继续执行(整个过程线程不需要上下文切换)
  • Java原生不支持协程,在纯java代码里需要使用协程的话需要引入第三方包,如:quasar

四、进程与线程对比

  1. 进程相互独立,而线程存在于进程内,是进程的一个子集
  2. 进程拥有共享的资源,如内存空间等,供其内部的线程共享(多个线程可以访问同一个共享变量)
  3. 线程上下文切换要比进程成本低

五、并行

  • 单核CPU下,任务调度器将CPU时间片(几十毫秒)分给不同线程使用,切换非常快,感觉是同时运行的(宏观并行,微观串行)
  • 并行是同一时间动手做多件事情的能力——>多个线程同时执行

六、并发

  • 并发是同一时间处理多件事情的能力——>多个线程交替执行

七、同步

  • 同步和异步关注的是消息通信机制
  • 需要等待结果返回,才能继续运行

八、异步

  • 同步和异步关注的是消息通信机制
  • 不需要等待结果返回,才能继续运行

九、阻塞

  • 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态
  • 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回

十、非阻塞

  • 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态
  • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

十一、同步/异步/阻塞/非阻塞例子

  • 同步阻塞:
    小明把普通水壶放到火上,然后等水开
    同步非阻塞:
    小明把普通水壶放到火上,然后去客厅看电视,时不时的去厨房看看水开没有
    异步阻塞:
    小明把响水壶放到火上,然后等水开
    异步非阻塞:
    小明把响水水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去处理
  • 普通水壶:同步
    响水壶:异步
  • 等水开的小明:阻塞
    边看电视,边等水开的小明:非阻塞
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逐渐江江江江化

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值