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

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

相关文章

【编程底层思考】垃圾收集机制,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系统中,我们可以在任务管理器中看 到进程) 线程:是程序运行的基本执行单元。当操作系统执行一个程序时, 会在系统中建立一个进程,该进程必须至少建立一个线

多线程篇(阻塞队列- LinkedBlockingDeque)(持续更新迭代)

目录 一、LinkedBlockingDeque是什么 二、核心属性详解 三、核心方法详解 addFirst(E e) offerFirst(E e) putFirst(E e) removeFirst() pollFirst() takeFirst() 其他 四、总结 一、LinkedBlockingDeque是什么 首先queue是一种数据结构,一个集合中

多线程篇(阻塞队列- LinkedBlockingQueue)(持续更新迭代)

目录 一、基本概要 1. 构造函数 2. 内部成员 二、非阻塞式添加元素:add、offer方法原理 offer的实现 enqueue入队操作 signalNotEmpty唤醒 删除线程(如消费者线程) 为什么要判断if (c == 0)时才去唤醒消费线程呢? 三、阻塞式添加元素:put 方法原理 图解:put线程的阻塞过程 四、非阻塞式移除:poll方法原理 dequ

spring笔记 多线程的支持

spring的工作机制 136  属性编辑器 140 spring事件的体系结构 168 Bean间的关系 109 继承 依赖 引用     Bean的继承          1 为了简化初始化的属性注入;          2 子Bean和父Bean相同的属性值,使用子Bean的     Bean的依赖 Srping控制相互依赖的Bean之间,属性注入的顺序,防止出错  depend-on

【编程底层思考】详解Java的JUC多线程并发编程底层组件AQS的作用及原理

Java中的AbstractQueuedSynchronizer(简称AQS)是位于java.util.concurrent.locks包中的一个核心组件,用于构建锁和其他同步器。AQS为实现依赖于FIFO(先进先出)等待队列的阻塞锁和相关同步器提供了一套高效、可扩展的框架。 一、AQS的作用 统一同步状态管理:AQS提供了一个int类型的成员变量state,用于表示同步状态。子类可以根据自己

多线程的系列文章

Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1)   Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多线程学习(四)等待/通知(wait/notify)机制 Java多线程学习(五)线程间通信知识点补充 Java多线程学习(六)Lock锁的使用 Java多