【多线程串联】换个思考维度,见怪不怪!

2024-05-27 07:28

本文主要是介绍【多线程串联】换个思考维度,见怪不怪!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

换个思考维度,见怪不怪!

  • 一、背景
  • 二、多线程串联
  • 三、总结

一、背景

前些时间刚进得物实习,初来驾到导师找我谈话…

导师:…(项目大体流程,和咱项目组是在里面的哪个位置)
导师:你说说你对多线程的理解呗?
我:…AQS是Java锁的基础,是对管程模型实现…(卧槽,答非所问,被自己蠢笑了)
导师:这种背诵的东西真的好蠢啊,其实多线程就那么回事,…(它将大部分知识给串联起来了)

这篇博客就是想通过导师所教我的,我来试着这样一次性的串串多线程和一些其他知识,我能理解他说的,他举的例子已经不记得了,下面说说我的理解吧~(这篇并不偏理论,可以当段子看看)

二、多线程串联

进程被意为是程序的执行实例,有独立的内存空间和资源,而线程呢,被意为是进程的执行单元,共享着进程的资源,线程去执行程序有着自己的执行流程。

对一个公司来说,它有它的地域、员工、设备、资金等等,里面有各团队的员工安排去做特定的任务,每个人去做特定的任务当然所做的步骤会有差异。那这公司可不可以类比成进程,员工可不可以类比成线程呢,它可以享用公司所供的特定的资源,像得物APP公司的会议室、办公区、餐饮室、健身房…这些都是共享的。(说一堆想解释的是,去以生活所见去学编程,会简单理解许多)

作为实习生的我,我来上班,我得需要上班工具吧,笔、笔记本、笔记本电脑…(这里只是举例,我上家实习,是自带…)这些给了我,我才能去工作,这是不是可以类比成创建线程需要为其分配对应的PC寄存器、虚拟机线程去执行程序?我员工座位下还有个规则,有锁的,可以放我们的一些私有东西,这可不可以类比成局部变量表?

线程池其实也是如此,就是有个池子,有着一定数目的核心线程,有任务来了就干,任务供大于核心线程的需,就放入一容器里等待被干,容器满了,就去当前线程数和最大线程数进行个对比,小了就去建,继续干,大了的话就交给咱所说的拒绝策略去做了。

当然,员工之间共同处事,特别是一项目组里员工共同去完成一个工程,期间需要对一些公共资源进行操作,员工之间需要进行通信协调,肯定是会有一些问题的。比如,一员工在本地对一平台共享文档进行操作,需要保存自己写的才会生效,那它在这本地修改,那另一个员工对这个它修改的内容是不可见的。这就类比于咱所说的JMM模型里,共享变量的可见性问题了。如果有这么一机制,另一个员工在对这个文档进行读的时候,会触发别的员工修改这个文档自动保存机制,然后这个员工在直接去那平台上读,那自然就可以想到volatile的作用了,保障可见性、有序性、禁止指令重排…

那员工之间的通信呢,无非就是找一个中间介质进行通信。就好比线程之间通信,像信号量、消息队列、共享内存等等。其实这种实现很简单,像JUC下的Semaphore,不就是通过AQS里的state属性吗,拿它当做中间介质,其他线程通过管程它判断是否还有共享锁,然后完成通信…

员工处理自身的工作有时候也会创建相应的东西,获取相应的数据资源,那这不就相当于ThreadLocal吗,数据线程内共享。

员工之间一起工作,肯定有些资源只能让一个人去碰的,比如会议室,不就只能让预约者进吗,非在会议组里的人是不应该进去的。那这不就相当于咱理解的锁机制吗?Java里面的锁机制无非就是围绕管程模型进行建立的,有共享变量、同步队列、条件队列,咱通过会议是否被预约判断是否可占有这个会议室,如果有人预约了,你还想占有这个会议室那自然被挂起然后放入同步队列中等待;像Java里关键字synchronized,还是基于AQS实现的ReentrantLock,都是如此,只不过前者依赖于对象里的ObjectMonitor对模型的实现,后者的话是AQS对模型的实现。

赛跑的时候运动员都准备就绪才允许吹哨开跑,菜上齐了所有人员才能一起吃饭,这种一等多和多等一的现象不就是咱所说的CountDownLatch嘛,它的话不也是AQS里的state维护的。不止它们,像ReentrantReadWriteLock也是基于这个state中间商实现的,道理都一样,只不过因为中间商state的含义不同,维护多线程之间的执行秩序就变得不一样了。

三、总结

“现在的你,就多听、多看、多想”

“没有人有义务教你,人本善良,只是希望你好”

如何让自己所学体系化,也许单纯依赖书籍、课程是不行的。

这篇关于【多线程串联】换个思考维度,见怪不怪!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1006824

相关文章

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

JAVA- 多线程

一,多线程的概念 1.并行与并发 并行:多个任务在同一时刻在cpu 上同时执行并发:多个任务在同一时刻在cpu 上交替执行 2.进程与线程 进程:就是操作系统中正在运行的一个应用程序。所以进程也就是“正在进行的程序”。(Windows系统中,我们可以在任务管理器中看 到进程) 线程:是程序运行的基本执行单元。当操作系统执行一个程序时, 会在系统中建立一个进程,该进程必须至少建立一个线