当前位置: 首页 > news >正文

juc学习笔记

并发基础

Thread 中有哪些与并发有关的变量?

原子操作类
AtmoicLong 是原子递增递减类,底层使用无阻塞cas实现。

并发队列
ConcurrentLinkedQueue 是线程安全的无阻塞队列,其底层使用单向链表实现,入队、出队都是操作使用volatil修饰的tail和head节点的cas算法。对于每一时刻,都会只有一个线程执行cas算法,其他线程会通过循环一次次执行cas操作直到成功,以cpu时间换取了线程调度和切换时间。

LinkedBlockingQueue 是线程安全的阻塞队列,其底层使用单向链表实现,入队出队操作分别使用一个独占锁从而保证原子性,所以入队出队操作可以同时执行。对于每一时刻,都会只有一个线程在执行入队出队操作,其他线程则会进入锁的阻塞队列并挂起,并且这两把锁都使用了条件变量用来协助完成线程同步,调用await的线程会进入条件队列并挂起。其实,这就是一个生产者消费者模型

ArrayBlockingQueue 是线程安全的阻塞队列,其底层使用数组实现,入队出队使用一个全局独占锁,所以某一时刻只能有一个线程执行入队或出队,其他线程则会进入锁的阻塞队列并挂起,并且这个全局锁也配置了条件变量用来协助完成线程同步,调用await的线程会进入条件队列并挂起。

锁原理
LockSupport 是一个工具类,是创建锁和同步类的基础,底层使用unsafe实现。其核心是“线程关联许可证”,调用unpark(thread)方法会赋予线程许可证,调用park(thread)方法会检测线程是否持有许可证,如果是则直接返回,否则阻塞挂起(该线程不再参与线程调度)。park方法响应中断,并且线程有可能被虚假唤醒,所以常用循环判断唤醒状态。

AQS 抽象同步队列,是juc包中锁的底层实现,是同步器的基础组件,由状态信息state、阻塞队列、条件变量Condition、条件队列(这两个队列都是双向队列并且元素类型都是Node,Node里封装了被阻塞的线程和原因——SHARED EXCLUSIVE CONDITION 等)、原子操作工具类unsafe。aqs定义了实现同步的骨架,其中具体操作和定义state都延迟到了子类去实现,不同的state定义对应不同的锁的语义和同步器的语义。(提一嘴这就是模板方法模式)如独占锁、共享锁、可重入锁、读写锁、信号量等。条件变量是协助锁实现线程同步的好帮手。

释放资源的过程:操作state(子类实现)激活阻塞队列队头节点,参与cas竞争。

线程池
ThreadPoolExecutor 有两把锁。第一把是整个线程池的独占锁,确保用户原子地更新线程池,维护的状态变量有:标志线程池运行状态和线程个数的ctl变量、工作线程集合、任务队列、完成的任务数量。第二把是工作线程自身,没错,工作线程实现runnable接口的同时也继承了aqs,该锁确保线程池原子地更新工作线程的状态,维护的状态变量有:aqs自带的status整型变量、该工作线程完成的任务数量。

线程池 ThreadPoolExecutor 有两个队列。第一个是线程池的锁的阻塞队列,重点是第二个任务队列,存放核心线程处理不完的任务,任务队列满时,则调用一定的拒绝策略。

线程池 有一个条件变量 awaittermination,由线程池的锁创建。当用户执行awaittermination操作时,用户会进入到条件队列中挂起等待设定的时间。

线程池的状态有:running -> shutdown -> tyding -> terminated 或者 running -> stop -> tyding -> terminated

shutdown方法:设置线程池状态为shutdown,设置所有空闲工作线程(state <= 0)的中断标志,尝试关闭线程池。(工作线程在执行任务时会先加锁,将status设置为1)
shutdownnow方法:设置线程池状态为stop,设置所有工作线程的中断标志,转移任务队列的所有任务到新集合tasks中,尝试关闭线程池

线程池的几大参数:核心线程数、最大线程数、任务队列类型、非核心线程空闲时间、拒绝策略、线程工厂、时间单位、
拒绝策略有:直接抛出异常、由调用线程执行、丢弃队列头的任务、丢弃当前任务

http://www.jsqmd.com/news/770151/

相关文章:

  • 梦境内核开发框架
  • 别再为动态IP发愁了!手把手教你用大华主动注册协议,让NVR/IPC轻松上云
  • MicroG在HarmonyOS系统上的兼容性挑战与解决方案
  • AUTOSAR MCAL实战:如何为TC397的SPI/ADC外设精准配置时钟源?
  • X-CoT:基于大语言模型的可解释视频检索框架
  • 3步完成!Media Extended Bilibili插件完整安装配置指南
  • 解决Android TV操作难题的终极方案:MATVT虚拟鼠标工具深度解析
  • 告别GUI!用MATLAB Appdesigner从零搭建可切换界面的数据工具(附完整源码)
  • 如何在5分钟内让通达信拥有专业缠论分析能力:ChanlunX插件终极指南
  • ESXi 7.0 U2部署后必做的5件事:从DHCP改静态IP到安全加固
  • 构建AI编程助手专业技能库:从提示词到上下文注入的实战指南
  • 从波形到时序路径:手把手教你用create_clock搞定复杂时钟(含Pulse Clk案例)
  • ESP32项目升级指南:如何将你的arduino-esp32代码库改造成ESP-IDF的‘正规军’组件
  • 2131. 连接两字母单词得到的最长回文串
  • 如何为Android TV添加虚拟鼠标功能:MATVT完整使用指南
  • 特斯拉Model 3/Y CAN总线DBC文件:开发者实战指南与车辆数据解析
  • 别再让OPC DA服务器崩溃了!一个JAVA连接中Group管理的致命坑与两种修复方案
  • GD32F450实战:从25MHz晶振到200MHz系统时钟,手把手配置AHB/APB分频
  • 从抓包到自动化:我是如何破解快手APP的token签名(__NStokensig)来爬取用户作品的
  • 保姆级教程:用SolidWorks/ANSYS复现一台YAH2460振动筛的动力学仿真与优化
  • 别再手动画图了!用evo工具箱5分钟搞定SLAM轨迹评估与可视化(附KITTI数据集实战)
  • Tiledesk开源客服平台:从部署到定制的完整指南
  • 在 Taotoken 平台查看模型广场并理解各模型特点与适用场景
  • MCP Explorer:AI工具链的可视化调试与集成测试平台
  • GIMP Resynthesizer终极指南:如何用AI纹理合成技术彻底改变你的图像编辑工作流
  • 终极皮肤管理指南:如何快速上手 d3dxSkinManage 工具
  • 论文AI率从90%降到3%!这4个降AI软件效果出奇好,顺利通过aigc检测!
  • 企业多模型 API 管理场景下如何利用 Taotoken 实现成本与稳定性平衡
  • 从“蒙特卡洛”到“马尔可夫”:手把手教你用Python模拟电力系统可靠性(附IEEE-RTS79案例代码)
  • 如何3分钟完成QQ空间历史数据备份:GetQzonehistory完整操作指南