多线程(四)
目录前言CAS什么是CASABA问题ABA问题的解决死锁死锁是什么如何避免死锁线程池ExecutorService 和 ExecutorsThreadPoolExecutor信号量 SemaphoreConcurrentHashMap前言本文简单介绍了CAS, ABA问题, 死锁, 线程池以及ConcurrentHashMapCAS什么是CAS全称Compare and swap字面意思:”比较并交换“, 一个 CAS 涉及到以下操作:我们假设内存中的原数据V旧的预期值A需要修改的新值B。比较 A 与 V 是否相等。比较如果比较相等将 B 写入 V。交换返回操作是否成功当多个线程同时对某个资源进行CAS操作只能有一个线程操作成功但是并不会阻塞其他线程,其他线程只会收到操作失败的信号, CAS可以视为一种乐观锁CAS其实是一个cpu指令, 单个的cpu指令, 是原子的ABA问题假设存在两个线程 t1 和 t2. 有一个共享变量 num, 初始值为 A线程 t1 想使用 CAS 把 num 值改成 Z:t1需要先读取num的值, 记录到oldNum中使用CAS判定当前num值是否为A, 为A则改为Z但是, t1执行这两个操作之间, t2线程可能将num值从A改为B, 又从B改为了A, t1 线程无法区分当前这个变量始终是 A, 还是经历了一个变化过程, 大部分的情况下, t2 线程这样的一个反复横跳改动, 对于 t1 是否修改 num 是没有影响的. 但是不排除一些特殊情况, 可能带来异常结果ABA问题的解决有增有减, 就可能出现ABA问题, 只要让判定的数值按照一个方向增长即可, 给要修改的值, 引入版本号. 在 CAS 比较数据当前值和旧值的同时, 也要比较版本号是否符合预期:如果当前版本号和读到的版本号相同, 则修改数据, 并把版本号 1.如果当前版本号高于读到的版本号. 就操作失败(认为数据已经被修改过了).死锁死锁是什么死锁是这样一种情形多个线程同时被阻塞它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞因此程序不可能正常终止.比较经典的例子就是哲学家就餐问题假设一张圆桌旁坐着 5 位哲学家他们的生活只有两件事思考 和 吃饭。桌子中央有一大盘意大利面。每位哲学家面前都有一根筷子总共 5 根筷子。要吃到面条哲学家必须同时拿起 左右两根 筷子。规则哲学家每次只能拿起一根筷子而且一旦拿起除非吃完否则不会放下。所有人都同时拿起了左边的筷子然后等待右边的筷子。结果所有人左手都有一根筷子但都在等右边的人放下筷子谁也吃不上永远僵持如何避免死锁死锁产生的四个必要条件互斥使用即当资源被一个线程使用(占有)时别的线程不能使用不可抢占资源请求者不能强制从资源占有者手中夺取资源资源只能由资源占有者主动释放。请求和保持即当资源请求者在请求其他的资源的同时保持对原有资源的占有。循环等待即存在一个等待队列P1占有P2的资源P2占有P3的资源P3占有P1的资源。这样就形成了一个等待环路当上述四个条件都成立的时候便形成死锁。当然死锁的情况下如果打破上述任何一个条件便可让死锁消失。其中最容易破坏的就是 “循环等待”:最常用的一种死锁阻止技术就是锁排序. 假设有 N 个线程尝试获取 M 把锁, 就可以针对 M 把锁进行编号(1, 2, 3…M).N 个线程尝试获取锁的时候, 都按照固定的按编号由小到大顺序来获取锁. 这样就可以避免环路等待.线程池ExecutorService 和 Executors频繁创建销毁线程的会比较低效, 线程池就是为了解决这个问题. 如果某个线程不再使用了, 并不是真正把线程释放, 而是放到一个 池子中, 下次如果需要用到线程就直接从池子中取, 不必通过系统来创建了ExecutorService 表示一个线程池实例.Executors 是一个工厂类, 能够创建出几种不同风格的线程池.ExecutorService 的 submit 方法能够向线程池中提交若干个任务.ExecutorServicepoolExecutors.newFixedThreadPool(10);pool.submit(newRunnable(){Overridepublicvoidrun(){System.out.println(hello);}});Executors 本质上是 ThreadPoolExecutor 类的封装ThreadPoolExecutorThreadPoolExecutor 提供了更多的可选参数, 可以进一步细化线程池行为的设定理解 ThreadPoolExecutor 构造方法的参数:把创建一个线程池想象成开个公司. 每个员工相当于一个线程corePoolSize: 核心线程数, 正式员工的数量maximumPoolSize: 最大线程数, 正式员工 临时工的数目keepAliveTime: 临时工允许的空闲时间unit: keepaliveTime 的时间单位, 是秒, 分钟, 还是其他值workQueue: 传递任务的阻塞队列, 正式员工忙不过来时新任务先放这里排队threadFactory: 创建线程的工厂, 参与具体的创建线程工作, 招聘渠道RejectedExecutionHandler: 拒绝策略, 当排队区满了、临时工也满了再来新任务怎么办AbortPolicy(): 超过负荷, 直接抛出异常.CallerRunsPolicy(): 调用者负责处理DiscardOldestPolicy(): 丢弃队列中最老的任务.DiscardPolicy(): 丢弃新来的任务信号量 Semaphore信号量, 用来表示 “可用资源的个数”. 本质上就是一个计数器.使用信号量可以实现 “共享锁”, 比如某个资源允许 3 个线程同时使用, 那么就可以使用 P 操作作为加锁, V 操作作为解锁, 前三个线程的 P 操作都能顺利返回, 后续线程再进行 P 操作就会阻塞等待,直到前面的线程执行了 V 操作.ConcurrentHashMapHashMpa本身不是线程安全的, 多线程下使用哈希表可以使用HashTable, ConcurrentHashMapHashTable只是简单的在关键方法上加上了synchronized关键字ConcurrentHashMap做出了一系列的优化和改进读操作没有加锁(但是使用了 volatile 保证从内存读取结果), 只对写操作进行加锁. 加锁的方式仍然是是用 synchronized, 但是不是锁整个对象, 而是 “锁桶” (用每个链表的头结点作为锁对象), 大大降低了锁冲突的概率充分利用 CAS 特性. 比如 size 属性通过 CAS 来更新. 避免出现重量级锁的情况优化了扩容的方式: 化整为零发现需要扩容的线程, 只需要创建一个新的数组, 同时只搬几个元素过去.扩容期间, 新老数组是同时存在的, 后续每个来操作 ConcurrentHashMap 的线程, 都会参与搬家的过程. 每个操作负责搬运一小部分元素搬完最后一个元素再把老数组删掉, 这个期间, 插入只往新数组加, 查找则需要同时查新数组和老数组

相关新闻

专业级浏览器媒体资源嗅探工具:猫抓Cat-Catch技术解析与应用指南

专业级浏览器媒体资源嗅探工具:猫抓Cat-Catch技术解析与应用指南

专业级浏览器媒体资源嗅探工具:猫抓Cat-Catch技术解析与应用指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓Cat-Catch是一款基…

2026/10/4 2:21:33 阅读更多 →
HarmonyOS应用实战-启示散页-50-发布截图别暴露用户题库:准备一套可复现的演示数据

HarmonyOS应用实战-启示散页-50-发布截图别暴露用户题库:准备一套可复现的演示数据

HarmonyOS 应用实战 50:发布截图别暴露用户题库,把截图环境做成可回滚数据沙箱 发布截图最怕一种“看起来很干净”的做法:开发者先把自己的题库改名,删掉几条提问历史,再对结果页做几次手工打码,然后拿这些…

2026/10/1 17:23:56 阅读更多 →
Git版本控制完整教程

Git版本控制完整教程

1、Git简介与核心价值:1.1、Git在开发中的核心作用:Git 在开发中可以管理好我们的代码,包括代码的更改、删除、合并等,极大提升团队协作效率和开发效率。实际运用场景:在学校给的作业任务中,要我们敲一个记…

2026/10/14 0:14:22 阅读更多 →

最新新闻

AI时代技术人的自我定位:从深夜焦虑到清醒重构

AI时代技术人的自我定位:从深夜焦虑到清醒重构

深夜两点半,我对着屏幕上几行代码发呆。旁边一个对话框里显示着AI给我生成的解决方案,思路清晰、注释完整、几乎无懈可击。这不是我第一次在深夜被这种清晰的"完美"击中——不是感到轻松,而是感到一阵彻骨的焦虑。那晚我没有继续写…

2026/10/16 12:58:54 阅读更多 →
SpringMVC+MyBatis+EasyUI分页实战:PageHelper集成与四层联动避坑指南

SpringMVC+MyBatis+EasyUI分页实战:PageHelper集成与四层联动避坑指南

简介:这是一份面向Java Web开发初学者与SSM框架实践者的完整分页功能集成Demo,聚焦Spring、SpringMVC、MyBatis与EasyUI四大技术栈的协同落地,解决Web应用中海量数据高效展示与交互的核心问题。资源包共122个文件,涵盖12个Java源码…

2026/10/16 12:58:54 阅读更多 →
free-claude-code轻代理模式:本地接入Claude代码能力的实操指南

free-claude-code轻代理模式:本地接入Claude代码能力的实操指南

1. 这个项目到底在解决什么问题 第一次看到“free-claude-code”这个标题,很多人会以为又是一个套壳聊天工具。但我实际拆解下来,它真正想解决的是一个很具体的痛点: 让开发者在不依赖官方订阅、不折腾复杂配置的前提下,把 Claud…

2026/10/16 12:58:54 阅读更多 →
Flex:ai开源组件:模型容器化部署的实战经验

Flex:ai开源组件:模型容器化部署的实战经验

做了两年多模型部署,我越来越觉得容器化这件事被严重低估了。模型训练有框架帮你兜底,但一到上线环节,Dockerfile怎么写、镜像怎么瘦身、GPU怎么调度、流量怎么切,全得自己一点点抠。这也是我发起 ModelEngine 并开源 Flex:ai 组件…

2026/10/16 12:58:54 阅读更多 →
Git上传代码到GitHub完整指南:main分支、SSH认证与初始化流程

Git上传代码到GitHub完整指南:main分支、SSH认证与初始化流程

1. 项目概述:从本地代码到远程仓库的完整闭环你手头刚写完一个功能完整的本地项目,目录结构清晰、代码跑得通、README也写好了——但下一步卡住了:怎么把它变成别人能搜到、能克隆、能协作的 GitHub 项目?这不是点几下鼠标就能搞定…

2026/10/16 12:58:54 阅读更多 →
跨领域迁移学习:打破认知牢笼,把经验炼成可迁移的思维模式

跨领域迁移学习:打破认知牢笼,把经验炼成可迁移的思维模式

本篇文章想聊一个很实际的话题:跨领域迁移学习。它不是讲机器的迁移学习,也不是讲考试刷题那种知识搬家,而是讲人类大脑如何把某个领域的内功心法,移植到另一个原本不相干的领域去。这个概念近几年在个人成长、产品设计、组织管理…

2026/10/16 12:57:54 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →