彻底掌握java多线程(知识点汇总+代码+面试题) 更新中……

2 篇文章 0 订阅
1 篇文章 0 订阅

基础知识

概念梳理

进程与线程

操作系统、进程、线程之间的关系:
操作系统、进程、线程之间的关系
    一个操作系统(operating system)包含多个进程,一个进程(process)包含一个或多个线程(thread)。

进程的概念: 进程是程序运行的实例,是资源分配的基本单元。
    当程序运行时操作系统就会给当前程序分配内存、cpu等资源。(一个程序执行时会产生一个或多个进程)。

线程的概念:线程是cpu的基本调度单位,每个线程执行的都是进程代码的某个片段。

线程间共享的资源:进程代码段】、【进程的公有数据‘利用这些数共享数据】、【线程很容易实现线程间的通讯】、【进程打开的文件描述符】、【信号的处理器】、【进程的当前目录】、【进程用户ID与进程组ID】。

线程间私有的资源: 【线程ID】、【寄存器组的值】、【线程的堆栈】、【错误返回码】、【线程的信号屏蔽码】

多线程

多线程的概念: 如果一个程序允许两个或多个线程,那么就是多线程程序。多线程是在一个进程中运行多个线程。

什么时候用到多线程: 当不同任务间相互独立,且能够满足业务需求,那么可以不使用多线程。如果不同任务间存在共享相同的数据、资源,需要相互配合,可以使用多线程。

  1. 为了同时做多件不同的事:①开网页时听音乐②后台定时任务
  2. 为了提高工作效率、处理能力:①tomcat②并行下载③NIO
  3. 需要很大并发量的时候:①对服务器压测

多线程的局限(弊端):

  1. 性能问题:上下文切换带来的消耗
  2. 异构化任务(任务结构不一样)很难高效并行
  3. 会引发线程安全问题:数据安全问题(例如:i++,非原子操作)、活跃性问题(线程饥饿,死锁)。

jvm会在程序启动时默认创建一些线程。
main线程: 主线程,程序的入口
finalizer: 负责对象的fanalizer()方法
Sigal Dispatcher: 把操作系统发来的信号分发给适当的处理程序
Reference handler: GC、引用相关的线程

为什么要使用多线程:

  1. 最主要的目的就是为了提高cpu的利用率(cpu是多核的)。
     ①提高处理速度
     ②避免无效等待(进行IO操作时可以做其他任务)。
     ③提高用户体验:避免卡顿,缩短等待时间
     ④并行处理、提高性能,例如在服务器领域,用多个线程接收HTTP请求,而不是单线程处理。

  2. 便于编程建模

  3. 计算机性能定律

   摩尔定律: 集成电路上可以容纳的晶体管数目在大约每经过24个月便会增加一倍。换言之,处理器的性能每隔两年翻一倍。(已失效)因为现在的元器件已经到达纳米级别,无法在短期内再次提升。

  阿姆达尔定律: 处理器越多,程序执行就越快,但有上限,取决于程序中串行部分的比例,并行比例越高,多处理器效果越明显。
在这里插入图片描述

串行、并行、并发


并发的两种概念:
(1)形容多个任务的执行状态: 一个处理器不停地切换线程执行任务(不会同一时间执行多个线程)。
(2)对“并发性”的简称: 程序中不同的部分可以无序或同时执行,且不影响最终的执行结果。

并行: 多个处理器同时执行不同的线程任务。

串行: 按照线程顺序依次执行(同一时间只能执行一个线程)。

易混淆的概念(正确的观点): 并行的同时一定是并发的。

并发并行产生的原因: cpu升级,操作系统升级,编程语言升级。

高并发

高并发是一种状态,同时间多个请求到达服务器。

多线程是处理高并发的一种解决方案。

高并发不意味着多线程:redis就是单线程的。

高并发的指标:

QPS(Queries Per Second)每秒查询数/每秒请求数

带宽

PV(Page View)24小时的页面访问量点击量

UV(Unique Visitor)去除相同用户的PV

IP(相同IP地址访问量)

并发连接数(The number of concurrent connections)

服务器平均请求等待时间(Time per request :across all concurrent request)

同步异步、阻塞非阻塞

同步与异步: 被动者是否主动告诉调用者结果。

例如:客户端向服务器发送请求,同步:会一只等待直到服务器响应,才发送下一个请求。异步:客户端会同时发送多个请求,此时服务器会告知客户端收到请求,正在处理。客户端可以继续完成其他工作,服务器处理完之后会正常响应。

在这里插入图片描述
同步: 同步异步指的是被调用者(服务器)的行为而不是请求方的行为。在没有得到结果之前,不会给客户端任何信息。

异步: 客户端发出请求后,服务器会立刻返回已接收信息。

阻塞与非阻塞: 指的是调用者(客户端)的行为,也就是发出请求时能否在等待响应的期间做其他的事。

同步阻塞: 调用者发出请求后不会收到被调用者的通知,并且调用者不能做其他的事。

同步非阻塞: 调用者发出请求后不会收到被调用者的通知,调用者可以做其他的事。

异步阻塞: 调用者发出请求后会收到调用者的通知,但由于是阻塞的所以调用者还是不能做其他的事请,只能等待响应。

异步非阻塞: 调用者发出请求后会收到调用者的通知,调用者可以做其他的事。

面试题

进程与线程的区别:

  1. 起源不同: 先有进程后有线程,为了提高cpu的利用率诞生了线程。线程为了提高程序的运行效率。
  2. 概念不同: 进程是程序运行的实例,系统分配资源,调度的单位。线程是cpu调度的单位。
  3. 内存共享方式上不同: 系统会为进程分配内存空间,不同进程之间的通常(IPC可实现进程间通信)是内存不共享的,线程可以一定量的直接访问共享内存。
  4. 拥有的资源不同: 进程拥有的资源大于线程。
  5. 数量不同: 一个进程至少拥有一个线程。
  6. 开销不同: ①线程的创建、终止时间比进程短。②同一进程内的线程切换时间比进程短。 ③ 同一进程的各个线程间共享内存和资源文件,可以不通过内核进行通信。
  7. 相同点: 生命周期:都有 就绪、等待、运行的状态。
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值