多线程学习笔记

【Nordic实战】nRF54L15引脚规划:电源域、专用引脚与低功耗设计避坑指南 本文深入解析Nordic nRF54L15芯片的引脚规划策略,重点阐述其基于电源域(MCU域、PERI域、LP域)的GPIO分配原则。文章提供了从思维转变到实战避坑的完整指南,强调遵循专用引脚与域对应关系是实现超低功耗设计的关键,并分享了系统化的引脚规划流程与工具使用建议。 阅读详情

多线程学习记录

同步类容器

  1. ConcurrentModificationException // 一边遍历一边修改会触发的异常(并发修改)

  2. Vector HashTable 由 Collections工具类中synchronized**方法

并发类容器

ConcurrentMap (相当于分表,分库的思想)
  • 核心思想: 减小锁的粒度从而降低锁的竞争
  • 详细说明: 采用段(Segment),每个段其实就是一个小的HashTable,只要多个修改操作不在同一个段上就可以并发进行,把一个整体分成了16个段,也就是最高支持16个线程的并发修改操作,并且代码中大多共享变量使用volatile关键字声明,目的是第一时间获取修改的内容,性能非常好
  • 常用实现有: ConcurrentHashMap、ConcurrentSkipListMap(支持并发排序功能)
CopyOnWrite(简称COW, 读写分离思想)
  • 核心思想: 读写分离思想
  • 详细说明: 写的时候先复制当前容器,在复制出来的容器中修改,修改完成之后,把原容器引用指向修改之后的值。期间如果有读的操作,会访问原容器。好处是可以对容器进行并发的读,而不需要加锁。因为当前容器不会被修改。
  • 试用场景: 读多写少的情况, 因为每次写都要复制原地址
  • 常用的实现: CopyOnWriteArrayList、CopyOnWriteArraySet
3. Queue
阻塞(BlockingQueue)
  • ArrayBlockingQueue(基于数组的阻塞队列实现,也叫有界队列):

    • 维护了一个定长数组,以便缓存队列中的数据对象
    • 其内部没有实现读写分离
    • 生产者和消费不能完全并行
    • 可以指定先进先出或者先进后出
  • LinkedBlockingQueue(基于链表的阻塞队列):

    • 与ArrayBlockingQueue类似,内部维持着一个数据缓冲队列(该队列由一个链表构成)
    • 可以高效的处理并发数据,是因为其内部实现采用分离锁(读写分离两个锁)
    • 生产者和消费可以完全并行
    • 无界队列
  • SynchronousQueue(一种没有缓冲的队列):

    • 没有缓冲的队列
    • 生产者生产的数据直接被消费消费
    • put放, take拿
  • PriorityBlockingQueue(基于优先级的阻塞队列):

    • 优先级的判断通过构造函数传入的Compator对象来决定的
    • 传入队列的对象必须实现Comparable接口
    • take的时候排序
    • 内部控制线程同步的锁采用的是公平锁
    • 无界队列
  • DelayQueue(带有延迟时间的Queue):

    • 其中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素
    • 传入队列的对象必须实现Delayed接口
    • 无界队列
    • 应用场景很多,比如对缓存超时的数据进行移除,任务超时处理,空闲连接的关闭等
非阻塞(ConcurrentLinkedQueue)
  • 不允许null元素
  • 先进先出
  • add,offer: 都是加入元素方法(在ConcurrentLinkedQueue中,这俩个方法没有任何区别)
  • poll,peek: 都是取头元素节点,区别在于前者会删除元素,后者不会。
4. Futrue模式(异步访问,Ajax)
  • 用户无须一直等待请求的结果,可以继续浏览或操作其他内容
  • 适用场景: 异步, 全双工模式
5. MasterWorker(将大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量)
  • 并行计算模式
  • 核心思想: Master进程和Worker进程,Master负责接收和分配任务,Worker负责处理子任务,当各个Worker子进程处理完成后,会将结果返回给Master,由Master做归纳和总结。
6. 生产消费模式
  • 类似MQ, 若干个生产者与若干个消费者
7. 多任务线程框架

Executor框架Executors,他扮演线程工厂的角色,我们通过Executors创建线程池
- newFixedThreadPool(), 创建一个固定数量的线程池
- 当一个任务进来的时候,先看有没有空闲线程,如果有空闲直接执行,如果没有空闲先放到队列中
- 考虑任务过多易发生OOM

  • newSingleThreadExecutor(),创建一个线程的线程池,若空闲则执行,若没有空闲线程则暂缓在任务列队中。

    • 与newFixedThreadPool相同只是线程数量为1
  • newCachedThreadPool()方法,返回一个可根据实际情况调整线程个数的线程池,不限制最大线程数量,若有任务,则创建线程,若无任务则不创建线程。如果没有任务则线程在60s后自动回收(空闲时间60s)

    • 默认为0,来一个线程创建一个线程
    • 采用SynchronousQueue(一种没有缓冲的队列)
    • 当线程空闲60s自动释放资源
  • newScheduledThreadPool()方法,该方法返回一个SchededExecutorService对象

    • DelayQueue(带有延迟时间的Queue)
    • 定时job
  • ++ThreadPoolExecutor:++ 所有功能的构造器,如果自身提供的不满足要求可以自己实现一个ThreadPoolExecutor

8. 自定义线程池
public ThreadPoolExecutor(int corePoolSize, // 核心线程数
                      int maximumPoolSize,  // 最大线程数
                      long keepAliveTime,   // 线程存活时长
                      TimeUnit unit,        // 与keepAliveTime配合使用
                      BlockingQueue<Runnable> workQueue, // 任务队列
                      ThreadFactory threadFactory,
                      RejectedExecutionHandler handler) // 拒绝策略
  • 有界队列与无界队列参数的区别

    • 有界队列: 若有新的任务需要执行,看有没有空闲线程如果有直接执行,如果没有把任务放入到队列中,如果队列已满则判断corePoolSize是否小于maximumPoolSize如果小于则创建新线程,否则采取拒绝策略

    • 无界队列:

      • 与有界队列相比,除非系统资源耗尽,否则无界的任务队列不存在任务入队失败的情况
      • 当有新任务到来,系统的线程数小于corePoolSize时,则新建线程执行任务,当达到corePoolSize后,就不会继续增加。若后续仍有新的任务加入,而没有空闲的线程资源,则任务直接进入队列等待
      • 若任务创建和处理的速度差异很大,无界队列会保持快速增长,直到耗尽系统内存
    • JDK拒绝策略:

      • AbortPolicy: 直接抛出导演阻止系统正常工作
      • CallerRunsPolicy: 只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务
      • DiscardOldestPolicy:丢弃最老的一个请求,尝试再次提交当前任务
      • DiscardPolicy:丢弃无法处理的任务,不给予任何处理
      • 自定义策略需要实现 RejectedExecutionHandler 接口
9. Executors框架
  • shutdown() 与 shutdownNow() 类似kill与kill -9
手把手教你用Cadence Virtuoso仿真一个5GHz CMOS分频器:从原理图到后仿,避开那些教科书上没写的坑 本文详细介绍了在Cadence Virtuoso环境中设计5GHz CMOS分频器的完整流程,从原理图设计到后仿真优化,特别关注实际工程中容易被忽视的关键问题。内容涵盖分频器核心指标解析、锁存器拓扑选择、接口设计匹配以及后仿真优化策略,为射频集成电路设计提供实用避坑指南。 阅读详情

相关推荐

从QEvent到系统响应:EC如何成为硬件事件的隐形信使

本文深入解析嵌入式控制器(EC)如何作为硬件事件的隐形信使,通过QEvent机制将按键、合盖等物理事件转换为SCI信号,并经由ACPI架构触发操作系统响应。EC与BIOS紧密协作,实现了从底层硬件到系统层面的高效事件传递,是嵌入式开发和系统优化的关键技术。

yellow的专栏 651

学习笔记二:java多线程

学习笔记二:java多线程

ningjia2013的专栏 412

HALCON基于描述符的模板匹配(未标定)

HALCON基于不标定描述符的模板匹配

king_linj的博客 891

Java多线程学习笔记

1.synchronized是关键字,Lock是接口;2.synchronized是隐式的加锁,lock是显式的加锁;3.synchronized可以作用于方法上,lock只能作用于方法块;4.synchronized底层采用的是objectMonitor,lock采用的AQS;5.synchronized是阻塞式加锁,lock是非阻塞式加锁支持可中断式加锁,支持超时时间的加锁;

2402_87028704的博客 712

C# 开发 WPS 插件实战:从环境搭建到功能实现(附完整代码)

本文提供了一份详尽的C#开发WPS插件实战指南,涵盖从环境搭建到功能实现的完整流程。通过COM技术,开发者可以创建自定义插件,为WPS Office扩展自动化功能,如文档处理与格式转换。文章包含核心概念解析、Ribbon界面集成、调试部署方法及完整代码示例,帮助开发者快速上手。

rust6ferris的博客 928

AI中台系统设计方案探讨

集成JupyterLab、低代码建模工具(如H2O.ai)、预训练模型库(Hugging Face、PaddleHub)。:通过REST/gRPC接口封装AI能力(如OCR、语音识别),支持流量控制与鉴权(如Kong、Apigee)。:服务注册发现(Consul)、熔断降级(Hystrix)、监控告警(Prometheus+Grafana)。:分布式存储(如HDFS、Ceph)与对象存储(如S3、OSS),支持海量数据高速读写。加密传输(TLS)、动态脱敏(如数据掩码)、访问控制(RBAC)。

reset2021的博客 1035

Java学习笔记-多线程

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。进程是程序的基本执行实体。当核心线程都在运行以及任务队列满之后才能运行临时线程。都满了之后,舍弃任务10/** 参数一:核心线程数量 >=0* 参数二:最大线程数 >0 最大数量 >= 核心线程数量* 参数三:空闲线程最大存活时间 >=0* 参数四:时间单位 用TimeUnit指定* 参数五:任务队列 不能为null* 参数六:创建线程工厂 不能为null* 参数七:任务的拒绝策略 不能为null。

qq_45773654的博客 884

AlertManager的使用(邮件和微信告警)

一、AlertManager概述 Prometheus 包含一个报警模块,就是我们的 AlertManager,Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重,降噪,分组等,是一款前卫的告警通知系统。 Alertmanager是一个独立的告警模块,接收Prometheus等客户端发来的警报,之后通过分组、删除重复等处理,并将它们通过路由发送给正确的接收器;告警方式可以按照不同的规则发送给不同的模块负责人,Alertman

weixin_45880055的博客 2万+

【JAVA】多线程学习笔记

多任务:多条执行路径,主线程和子线程并行交替执行程序:指令和数据的有序集合进程(Process):执行程序的一次执行过程,是资源分配的单位,每个进程有独立的地址空间线程(Thread):是CPU调度和执行的单位,一个进程可以有多个线程,共享进程的地址空间。线程有优先权,新线程的优先级较高。*真正的多线程是指多核/多CPU,如服务器。只有一个CPU的情况下,在同一个时间点只能执行一个代码,但是因为切换的很快所以就有同时执行的错觉。

weixin_47979757的博客 860

深入理解 Terraform 中的资源更新与管理

摘要:本文探讨Terraform处理AWS安全组名称变更时的行为。当修改不可变属性(如安全组名称)时,Terraform会创建新资源并删除旧资源。通过状态文件比对所需状态与实际状态,Terraform对不可变属性采用"先创建后删除"策略,对可变属性则直接更新。实例演示了修改安全组名称和关联EC2实例时的处理过程,强调理解资源属性可变性对基础设施管理的重要性。(149字)

2501_90323865的博客 472

SAP S/4HANA Cloud 管理员业务角色创建实战:基于 SAP_BR_ADMINISTRATOR 模板的一站式指南

摘要:SAP S/4HANA Cloud新系统初始登录时常见Fiori Launchpad无磁贴的问题,这是由于缺乏合适的业务角色分配。本文介绍了通过预交付的SAP_BR_ADMINISTRATOR模板创建管理员角色的完整流程,包括业务用户、业务角色和业务目录的核心概念解析。重点说明了直接使用模板的风险,并提供了从模板创建自定义管理员角色的详细步骤(4.1-4.3),以及权限限制设置的注意事项。文中还分享了一个实际项目案例,强调正确配置管理员角色对后续权限体系建设的关键作用。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 205

java多线程个人学习笔记

需要在创建的类中重写run()方法,并将实现线程功能的代码写入run()方法,然后调用Thread类的start()方法执行线程。如果多线程程序中: 存在一个线程,现在需要插入另一个线程,要求插入的线程结束才能继续执行原来的线程,此时就需要用到join()方法。当创建一个新线程时,如果没有显式设置优先级,它将继承父线程的优先级,默认情况下父线程优先级为。每一个线程都有各自的优先级,如果有很多线程处于就绪状态,系统就会根据优先级来决定那个线程进入运行状态。线程是程序执行的最小单位,属于进程的一个执行单位,

2401_84040384的博客 835

【ZYNQ】VDMA 的使用

VDMA, Video Direct Memory Access 是 Xilinx 官方提供的高速内存存取 IP,采用 AXI4-Stream 与 AXI4 协议实现存储映射接口(Memory Map)与非存储映射接口(Non-Memory Map)接口的转换,主要用于视频数据缓存,同时提供帧缓存与帧同步控制功能。本文主要介绍 AXI VDMA 的配置与使用方法。

洋洋Young的博客 1581

Java6学习笔记56——多线程编程——线程的创建方法2

本文已搬家至【Java学习笔记】多线程

gnuhpc的专栏 1052

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

多线程学习笔记01线程、进程、多线程与线程创建

多线程学习笔记01线程、进程、多线程与线程创建。

2501_90425057的博客 1667

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java学习笔记——多线程

总结:1.程序、进程和线程的区分:程序(program):为完成特定任务,用某种语言编写的`一组指令的集合`。即指一段静态的代码。进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。程序是静态的,进程是动态的。进程作为操作系统调度和分配资源的最小单位。线程(thread):进程可进一步细化为线程,是程序内部的一条执行路径线程.作为CPU调度和执行的最小单位2.线程调度策略分时调度:所有线程轮流使用`CPU`的使用权,并且平均分配每个线程占用CPU的时间。

qq_58956810的博客 1084

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java多线程学习笔记(一)

一、看源码 1、 java.util.concurrent 包 √\color{#FF7D00}{√}√  Executor(interface): 只有一个 execute ( Runnable command ) 方法,没有返回值,但是没有标注@FunctionalInterface? √\color{#FF7D00}{√}√  ExecutorService(interface)(extends Executor): 在 executor 上封装了一层,提供了 Runnable(Callable

子龙的博客 253

java 多线程笔记_Java多线程学习笔记(全).pdf

Java多线程学习笔记(全)一.线程的创建和启动java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每条线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序流的代码)。Java使用run方法来封装这样一段程序。1.继承Thread类创建线程类/**继承Thread来创建线程类*/public class FirstThread extends Thre...

weixin_32017139的博客 213

多线程技术学习笔记(尚学堂-百战)

多线程技术学习笔记

boke00_7的博客 1054

Python 之 多线程编程学习笔记

Python之多线程编程学习笔记  在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。 这里整理一下Python程序设计中使用多线程的几种方法。 1. 使用Thread模块相关的函数实现多线程 先

仰望圣光的plusplus7 950

【自用学习笔记】Java多线程

进程中的线程是由CPU负责调度执行的,但CPU能同时处理线程的数量有限,为了保证全部线程都能往前执行,CPU会轮询为系统的每个线程服务,由于CPU切换的速度很快,给我们的。加锁:每次只允许一个线程加锁,加锁后才能进入访问,访问完毕后自动解锁,然后其他线程才能再加锁进来。多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行)程序中如果只有一条执行流程,那这个程序就是单线程的程序。线程是属于进程的,一个进程中可以同时运行很多个线程。正在运行的程序(软件)就是一个独立的进程。

qq_52726887的博客 630

Qt学习笔记(四)多线程

在Qt中,多线程的处理一般是通过QThread类来实现。QThread代表一个在应用程序中可以独立控制的线程,也可以和进程中的其他线程共享数据。之前我们在Linux应用篇中提到过多线程的概念,使用它的好处是可以同时操作好几个目标,而不是因为上一个目标未结束使得需要的操作陷入阻塞状态。

sincerelover的博客 898

多线程(黑马程序员学习笔记)

本文是黑马程序员Java视频教程的学习笔记,重点介绍了进程、线程及其在Java中的实现方式。进程是系统资源分配的基本单位,具有独立性、动态性和并发性;线程是进程中的任务执行单元,多线程能提高执行效率。Java中开启线程的方式包括继承Thread类、实现Runnable接口和实现Callable接口,分别适用于不同场景。文章还详细讲解了线程的常用方法,如获取线程名称、线程休眠、设置优先级和守护线程等。此外,探讨了线程安全问题及解决方案,如同步代码块、同步方法和Lock锁,并介绍了死锁的产生条件及避免方法。

A2294249395的博客 1636

《Java面向对象编程》学习笔记13——多线程的相关事项

本文已搬家至【Java学习笔记】多线程

gnuhpc的专栏 1561
上一篇: Shell调试方法
下一篇: PG常用(通用)功能
Raybor
博客等级 码龄12年 29粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值