听故事彻底理解Java 并发

多智能体系统实战:基于 AgentScope Java 构建高并发故事创作平台 不要把故事创作当成同步接口问题,要把它当成异步任务系统来设计。多智能体协作优先采用 DAG 编排,而不是简单串行调用。Agent 必须职责单一、输入输出结构化、可独立测试。模型调用必须统一接入 LLM Gateway,不要散落在业务代码中。高并发优化重点是线程池隔离、背压控制、消息解耦,而不是盲目堆机器。所有阶段都要持久化快照,否则质量优化和问题排查几乎无从下手。系统必须具备幂等、重试、超时、熔断、死信等分布式治理能力。观测维度至少覆盖任务、阶段、模型、成本四个层面。 阅读详情

最近在给别人讲解Java并发编程面试考点时,为了解释锁对象这个概念,想了一个形象的故事。

后来慢慢发现这个故事似乎能讲解Java并发编程中好多核心概念,于是完善起来形成了这篇文章。

故事可能比较奇怪。有这么一个学校,里面有好多好多人,我们简单分成学生、老师、以及宿管阿姨。

学校中间还有一个很奇葩的水果超市,里面有个仓库放着苹果、西瓜、橘子。来这个超市的人,一方面可以拿走水果吃掉,另一方面也可以送来水果还钱。

不过超市还有一个很奇葩的规则,就是学生只能去吃或者送苹果,老师则只能西瓜,宿管阿姨只能橘子。

这个超市的进出也很有规矩,来这个超市的人,必须持有相应的证件,学生则需要持有学生证,老师需要持有教师证,宿管阿姨需要持有阿姨证。

这三个证每个都分别只有一个,保管在超市门口的一个领证处,人们进入这个超市之前,必须先去取证处那里领取相应的证件才能进入。

如果证件暂时被别人取走了拿不到,则需要到后方的等待区里面排队等证。

那这个等待区也有三个,分别是学生证等待区,教师证等待区,阿姨证等待区。

进入超市里面就更加奇葩了,不论是要从这个超市拿走水果,还是要送来水果,都需要通过一个操作台来控制,而这个操作台,同一时刻只能有一个人进行操作。

这个操作台为了防止有人霸占操作台过长时间,只允许一个人持续操作10s钟,10s之后会在屏幕上显示一个ID,只有这个ID的人才能来操作

至于选择什么号码,老师学生或是宿管阿姨都无法决定和干预,只能任凭这个操作台来决策。

但好在,每个人在操作台上都有自己的账号,操作一半被中断的数据并不会丢失。

这个故事的背景就介绍完了,下面这个学校就发生了各种各样的事。

首先我们假设,进这所学校的人,都是为了去超市做事情。某一时刻,操作台上显示了一个号码2号,这个号码通过各种学校大屏幕通知给所有的人。

于是ID为2号的学生小明看到了自己的号码,得知自己获得了进入超市操作控制台的权利,于是出发前往超市。

小明首先到超市门口,问领证处的管理人员,“给我一张学生证!”。

管理人员找了找发现有一张学生证,于是便给了小明。小明拿到了学生证,顺利进入超市,并坐上了操作台前,登录了自己的账号系统。

小明此行的目的是为了拿走一个苹果,于是他点击了苹果商品的图标,系统显示苹果还有4个。于是小明顺利地拿走了苹果,系统将苹果数量-1,将新的苹果数量3记录到总系统库中。

接着小明走出超市,将学生证交还给了领证处,走出了校园,消失在外面的人海中。

接着操作台上显示了3号,同样通过学校大屏幕通知给了所有人。ID为3号的学生小张看到了自己的号码,得知自己获得了进入超市操作控制台的权利,于是出发前往超市。

小张和小明做着完全相同的操作,但小张操作太慢了,刚刚点击完了苹果商品的图标,系统就显示了下一个人的号码5号。此时小明只能被迫终止自己的操作,让出操作台的权利。

ID为5号的学生小王接到通知,兴冲冲地前往超市,并在领证处问管理人员,“给我一张学生证!”

管理人员找了找,发现学生证已经被小张取走了,只能告诉小王,“抱歉,学生证暂时没有,请到后面的学生证等待区排队吧!”。小王没办法,只能乖乖去排队了。

这时操作台再次显示了3号,也就是刚刚操作到一半的小张。小张此时还在超市里,并不需要重新进入,于是小张赶紧到操作台前继续着刚刚的操作,取走了一个苹果,离开了超市,交还了学生证。

此时领证处的管理人员收到了学生证,对着后面的学生证排队区喊,“学生证有啦,排队的人过来取吧!”

正在排队等证的5号小王听到后,从排队的队列里出来,准备领证并进入超市。但此时操作台上显示的号是另一个学生10号,10号学生拿走了学生证,进入超市开始操作。

操作到一半,操作台时间限制又到了,显示了小王的ID 5号。小王刚从等待领证的队列里出来,终于获得了进行下一步行动的准许,于是走向了领证处,“给我一张学生证!”

由于学生证已经被10号拿走,管理人员只能说,“抱歉,学生证暂时没有,请到后面的学生证等待区排队吧!”。

小王一看等了那么久居然又被别人抢先了一步,刚想爆粗口,想到了这个学校的名言,“这个世界是不公平的”,于是又乖乖走向了学生证等待区,继续排队。

等10号操作完出来了,还了学生证,小王又被领证处管理员喊话,“学生证有啦,排队的人过来取吧!”。

小王走出排队区,而此时操作台终于显示了小王的号码5号。小王这次顺利领取了学生证,进入了超市,坐在了操作台上,登录了自己的系统。

小王想买苹果,于是点击了苹果商品的按钮,但系统显示苹果数量为0!小王此时想了想,有了个接下来的计划:

  1. 继续呆在超市里,得空就去操作台上查询一下苹果的数量,直到有苹果为止。
  2. 但继续呆在超市里,可能导致想向超市送苹果的学生拿不到学生证,而自己也就永远无法得到苹果了,显然不妥。
  3. 所以小王的另一个想法是,走出超市,交还学生证,等下次有机会再进入超市查看苹果数量,直到有苹果为止。
  4. 这样虽然有机会得到苹果,但太累了,假如这期间根本没人往超市送苹果,那这一趟趟其实是白费事的。
  5. 于是小王想出了一个聪明的方案,我可以走出超市,到一个地方等待,在这里不会收到操作台的通知。
  6. 但如果有人向超市送苹果了,那这个等待区里会发一个信号,这时超市才有可能是有苹果的,这时我从等待区里出来,等待叫号的机会。
  7. 虽然苹果有可能被其他吃苹果的学生抢没,但这样起码不会浪费太多时间。

刚刚好超市旁边为每一种水果准备了好多等待区,一共有六个,分别是:苹果没了等待区,西瓜没了等待区,橘子没了等待区。苹果满了等待区,西瓜满了等待区,橘子满了等待区。

小王很聪明,去了苹果没了等待区,等待着有人往里送苹果的信号。

这时小孙走进了超市,给超市添置了5个苹果,并换来了零花钱。之后他立刻通知苹果没了等待区,给了个信号“超市有苹果啦!”,但此时小孙还没有走出超市呢。

小王在等待区里收到信号,立刻走出了等待区,等待被叫号,以完成自己吃苹果的任务。但很不幸,在小王得到叫号机会之前,苹果又被其他几个学生抢光了,这时才轮到小王。

小王也很聪明,他考虑到了这种情况,没有直接取苹果,而是重新查询了一变苹果数量,发现苹果数量为0,于是重复之前的步骤,小王再次回到了苹果没了等待区。

接下来的时间里,小王不断在苹果没了等待区和学生证等待区移动,小王发现为了吃一个苹果太难了,必须同时满足:苹果没了等待区发来了“超市有苹果了”的信号,领证区此时有学生证,并且在操作台上查询出的苹果数量不为0。

终于有一次。小王成功满足了这三个条件,在操作台上看到苹果的数量为1!小王正激动地准备按下购买按钮,可此时操作台一闪,突然出现了别人的号码。

这个人是超市管理员,拿着一张特殊的超市管理员证顺利进入了超市,将苹果拿走,此时苹果数量又变成了0。

之后又轮到小王操作,但小王并不知道之前发生的一切,他眼中明明看到苹果数量是1。小王为了保险起见,又多次查询了苹果数量,发现仍然是1,于是兴奋地点下了购买按钮!

于是,操作台对根本没有苹果的储藏区发出了取苹果的指令,该系统根本没有想到会有这种事情发生,于是机器炸了,整个学校夷为平地。

数年后,学校慢慢被重新建立了起来,之前做操作台的人已经被枪毙了,高薪聘请了一位高人来建造,解决了之前的那个问题。

超市又顺利运转起来,有时超市只有一个人,有时超市会有三个人,分别是学生、老师、宿管阿姨,他们仨人互不影响,相安无事。学校的生活再次丰富了起来。

----------------------华丽的分割线-----------------------

这个故事包含了Java多线程的大部分核心问题,下面我把故事重新讲一遍。

有这么一个学校(Java虚拟机),里面有好多好多人(线程),我们简单分成学生、老师、以及宿管阿姨。

学校中间还有一个很奇葩的水果超市(临界区),里面有个仓库放着苹果、西瓜、橘子(临界区里的受保护资源)。

来这个超市的人,一方面可以拿走水果吃掉,另一方面也可以送来水果还钱。不过超市还有一个很奇葩的规则,就是学生只能去吃或者送苹果,老师则只能西瓜,宿管阿姨只能橘子。

这个超市的进出也很有规矩,来这个超市的人,必须持有相应的证件(锁对象),学生则需要持有学生证,老师需要持有教师证,宿管阿姨需要持有阿姨证(不同的锁对象)。

这三个证每个都分别只有一个,保管在超市门口的一个领证处(获取锁的地方--可以说是堆吧),人们进入这个超市之前,必须先去取证处那里领取相应的证件(获取锁)才能进入。

如果证件暂时被别人取走了拿不到(获取锁失败),则需要到后方的等待区(同步队列SychronizedQueue)里面排队等证。那这个等待区也有三个,分别是学生证等待区,教师证等待区,阿姨证等待区(每个锁对象对应一个同步队列)。

进入超市里面就更加奇葩了,不论是要从这个超市拿走水果,还是要送来水果,都需要通过一个操作台(单核CPU)来控制,而这个操作台,同一时刻只能有一个人进行操作。

这个操作台为了防止有人霸占操作台过长时间,只允许一个人持续操作10s钟(CPU时间片),10s之后会在屏幕上显示一个ID,只有这个ID的人才能来操作(线程切换)

至于选择什么号码,老师学生或是宿管阿姨都无法决定和干预,只能任凭这个操作台来决策(操作系统决定线程的切换和时间的分配)。但好在,每个人在操作台上都有自己的账号(线程的工作内存),操作一半被中断的数据并不会丢失。

这个故事的背景就介绍完了,下面这个学校就发生了各种各样的事。

首先我们假设,进这所学校的人,都是为了去超市做事情。首先人出现在学校外(线程状态NEW),人进入学校(线程状态RUNNABLE)。

某一时刻,操作台上显示了一个号码2号,这个号码通过各种学校大屏幕通知给所有的人。于是ID为2号的学生小明看到了自己的号码,得知自己获得了进入超市操作控制台的权利(获得CPU执行权),于是出发前往超市。

小明首先到超市门口,问领证处的管理人员,“给我一张学生证!”(获取锁)。管理人员找了找发现有一张学生证,于是便给了小明。

小明拿到了学生证,顺利进入超市(获取锁成功,进入临界区),并坐上了操作台前,登录了自己的账号系统(准备好工作内存,开始执行临界区代码)

小明此行的目的是为了拿走一个苹果,于是他点击了苹果商品的图标,系统显示苹果还有4个。于是小明顺利地拿走了苹果,系统将苹果数量-1,将新的苹果数量3记录到总系统库中(代码)。

接着小明走出超市(代码执行完毕出临界区),将学生证交还给了领证处(释放锁),走出了校园(线程状态TERMINAL),消失在外面的人海中。

接着操作台上显示了3号,同样通过学校大屏幕通知给了所有人。ID为3号的学生小张看到了自己的号码,得知自己获得了进入超市操作控制台的权利,于是出发前往超市。

小张和小明做着完全相同的操作,但小张操作太慢了,刚刚点击完了苹果商品的图标,系统就显示了下一个人的号码5号。此时小张只能被迫终止自己的操作,让出操作台的权利(线程切换)。

ID为5号的学生小王接到通知,兴冲冲地前往超市,并在领证处问管理人员,“给我一张学生证!”。

管理人员找了找,发现学生证已经被小明取走了,只能告诉小王,“抱歉,学生证暂时没有,请到后面的学生证等待区(同步队列WaitQueue)排队吧!”(获取锁失败)。小王没办法,只能乖乖去排队了(线程状态BLOCKING)。

这是操作台再次显示了3号,也就是刚刚操作到一半的小张。小张此时还在超市里(不释放锁),并不需要重新进入,于是他赶紧到操作台前继续着刚刚的操作(线程切换,继续执行中断的代码),取走了一个苹果,离开了超市,交还了学生证(释放锁)。

此时领证处的管理人员收到了学生证,对着后面的学生证排队区喊,“学生证有啦,排队的人过来取吧!”(通知同步队列出队)。

正在排队等证的5号小王听到后,从排队的队列里出来,准备领证并进入超市。但此时操作台上显示的号是另一个学生10号,10号学生拿走了学生证,进入超市开始操作。

操作到一半,操作台时间限制又到了,显示了小王的ID 5号。小王刚从等待领证的队列里出来,终于获得了进行下一步行动的准许,于是走向了领证处,“给我一张学生证!”

由于学生证已经被10号拿走,管理人员只能说,“抱歉,学生证暂时没有,请到后面的学生证等待区排队吧!”

小王一看等了那么久居然又被别人抢先了一步,刚想爆粗口,想到了这个学校的名言,“这个世界是不公平的”,于是又乖乖走向了学生证等待区,继续排队。(非公平锁,并不是谁等的时间最长谁就获取锁)

等10号操作完出来了,还了学生证,小王又被领证处管理员喊话,“学生证有啦,排队的人过来取吧!”

小王走出排队区,而此时操作台终于显示了小王的号码5号。小王这次顺利领取了学生证,进入了超市,坐在了操作台上,登录了自己的系统。

小王想买苹果,于是点击了苹果商品的按钮,但系统显示苹果数量为0!小王此时想了想,有了个接下来的计划:

  1. 继续呆在超市里,得空就去操作台上查询一下苹果的数量,直到有苹果为止。
  2. 但继续呆在超市里,可能导致想向超市送苹果的学生拿不到学生证,而自己也就永远无法得到苹果了,显然不妥。(sychronized代码块里循环等待)
  3. 所以小王的另一个想法是,走出超市,交还学生证,等下次有机会再进入超市查看苹果数量,直到有苹果为止。
  4. 这样虽然有机会得到苹果,但太累了,假如这期间根本没人往超市送苹果,那这一趟趟其实是白费事的。(sychronized代码块外循环等待)
  5. 于是小王想出了一个聪明的方案,我可以走出超市,到一个地方等待(wait),在这里不会收到操作台的通知。如果有人向超市送苹果了,那这个等待区里会发一个信号(notify),这时超市才有可能是有苹果的,这时我从等待区里出来,等待叫号的机会。
  6. 虽然苹果有可能被其他吃苹果的学生抢没,但这样起码不会浪费太多时间。(等待通知机制)

刚刚好超市旁边为每一种水果准备了好多等待区(等待队列WaitQueue),一共有六个,分别是:苹果没了等待区,西瓜没了等待区,橘子没了等待区。苹果满了等待区,西瓜满了等待区,橘子满了等待区(条件变量Condition)。

小王很聪明,走出超市交还学生证(wait会释放锁),去了苹果没了等待区(wait),等待着有人往里送苹果的信号(同步信号-唤醒)。

这时小孙走进了超市,给超市添置了5个苹果,并换来了零花钱。之后他立刻通知苹果没了等待区,给了个信号“超市有苹果啦!(AppleNotEmpty.notifyAll)”,但此时小孙还没有走出超市呢(notify不释放锁)。

小王在等待区里收到信号,立刻走出了等待区,等待被叫号,以完成自己吃苹果的任务。但很不幸,在小王得到叫号机会之前,苹果又被其他几个学生抢光了,这时才轮到小王。

小王也很聪明,他考虑到了这种情况,没有直接取苹果,而是重新查询了一变苹果数量(wait一般配合while条件),发现苹果数量为0,于是重复之前的步骤,小王再次回到了苹果没了等待区。

接下来的时间里,小王不断在苹果没了等待区和学生证等待区移动,小王发现为了吃一个苹果太难了,必须同时满足,苹果没了等待区发来了“超市有苹果了”的信号,领证区此时有学生证,并且在操作台上查询出的苹果数量不为0。

终于有一次。小王成功满足了这三个条件,在操作台上看到苹果的数量为1!小王正激动地准备按下购买按钮,可此时操作台一闪,突然出现了别人的号码。

这个人是超市管理员,拿着一张特殊的超市管理员证顺利进入了超市,将苹果拿走,此时苹果数量又变成了0。

之后又轮到小王操作,但小王并不知道之前发生的一切,他眼中明明看到苹果数量是1。小王为了保险起见,又多次查询了苹果数量,发现仍然是1(非volatile修饰的变量不保证线程之间的可见性),于是兴奋地点下了购买按钮!

于是,操作台对根本没有苹果的储藏区发出了取苹果的指令,该系统根本没有想到会有这种事情发生,于是机器炸了,小王牺牲(抛出运行时异常,线程释放锁并终止)。

数年后,之前做操作台的人已经被枪毙了,学校又高薪聘请了一位高人来建造,解决了之前的那个问题(volatile)。

超市又顺利运转起来,有时超市只有一个人(不同线程进入锁对象相同的临界区会互斥,只有一个线程可以进入),有时超市会有三个人(不同锁对象的临界区不互斥),分别是学生、老师、宿管阿姨,他们仨人互不影响,相安无事。学校的生活再次丰富了起来。

故事讲完了,虽然不能解释全部并发编程的内容,也不能处处都很恰当地说明细节,但却是一个很有趣的思考过程

希望大家也能积极讨论下故事中的错误和不完善的地方,一起将故事讲的更好。下面整理一下故事中出现的东西和寓意。

 

PyTorch实战(30)——使用TorchScript和ONNX导出通用PyTorch模型 在本节中,我们将深入探讨使用 TorchScript 导出 PyTorch 模型。通过序列化,TorchScript 使模型与 Python 生态系统独立,从而使得模型可以在其他环境中加载,例如基于 C++ 的环境。我们还跨越 Torch 框架与 Python 生态的边界,研究机器学习通用开放格式 ONNX,该技术能帮助我们将 PyTorch 训练的模型导出至非 PyTorch 甚至非 Python 环境。 阅读详情

相关推荐

手把手教你用FFmpeg实操:H.264转码、AVS2编码与H.265/HEVC参数调优避坑指南

本文详细解析了使用FFmpeg进行H.264转码、AVS2编码与H.265/HEVC参数调优的实战技巧。通过具体命令示例和参数详解,帮助开发者避开常见编码陷阱,提升视频处理效率和质量,特别适合音视频开发者和内容创作者参考。

weixin_30889885的博客 486

一则故事表达:并发,并行,同步,异步,线程,多线程

一个小事件说明下并发,并行,同步,异步,线程,多线程 一个广交会举办向8间公司发起展览邀请, 参展公司有8间,场地有80万平方米的展示区域, 每个参展商有10万平方米可以用于展出售卖, 每个参展公司仅仅配备1个员工,每个货架之间都有距离, 员工在销售时需要去到货架前面,每个货架仅能放一种商品。 8间公司的摊位:多进程 8间公司都在售卖中:并行 第1间公司有1个货架,货架有1个商品:1线程 第2间公司有20个货架,每个货架有1个商品:20线程 第3间公司有1个货架,货架配置100件商品:单线程并发(异步)

LuiChun 362

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月12日-生产期间维护用的双重隔离

生产期间维护用的双重隔离。该程序用于准备将一个或多个双工位设置为维护状态,同时SABRE 3D/3DxT/3D Scimitar保持生产运行。其目的是在不中断生产的情况下将双工位与运行中的设备隔离。

weixin_46735260的博客 574

java宿舍信息管理系统_Java宿舍管理系统

项目描述Java+MySQL+EasyUI框架,实现的宿舍管理系统的项目运行环境jdk7+tomcat7+mysql+IntelliJ IDEA项目技术(必填)jsp+java servlet+easyui+jquery+css数据库文件(可选)链接:https://pan.baidu.com/s/1GHUpDbWc9CEwdzFGuC4iYA提取码:7min依赖包文件(可选)压缩包超内自带...

weixin_42627853的博客 747

YOLO26涨点改进 | 小目标损失函数独家改进篇 | TGRS 2025 | 引入AdaFocalLoss损失函数,改进小目标检测,自适应聚焦小目标与样本分布不平衡,提升检测精度与训练稳定性

本文提出将AdaFocalLoss损失函数应用于YOLO26模型优化,有效提升小目标检测性能。AdaFocalLoss通过目标尺寸感知机制和IoU引导的动态调节,自动调整训练权重和聚焦程度,解决了样本不平衡问题。相比传统损失函数,它无需手动调参,能增强训练稳定性,在多尺度、复杂场景下表现优异。文章详细介绍了AdaFocalLoss的原理、优势及实现方法,并提供了代码集成指南。实验表明该方法能显著提升检测精度和鲁棒性,特别适用于小目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 337

R语言生存分析之竞争风险模型

R语言生存分析之竞争风险模型 竞争风险模型(Competing Risk Model)是一种处理多种潜在结局生存数据的分析方法,早在1999年Fine和Gray就提出了部分分布的半参数比例风险模型,通常使用的终点指标是累积发生率函数(cumulative incidence function,CIF)。 研究中结局事件可能有多个,某些结局将阻止感兴趣事件的出现或影响其发生的概率,各结局事件形成“竞争”关系,互为竞争风险事件。 竞争风险模型( Competing Risk Model ) : 指

data+scenario+science+insight 5248

java宿舍管理系统代码_JAVA学生宿舍管理系统

需要的工具1.SQL Server2.Eclipse3.JDBC连接数据库驱动https://download.microsoft.com/download/A/F/B/AFB381FF-7037-46CE-AF9B-6B1875EA81D7/sqljdbc_6.0.8112.200_chs.exe功能实现分为三大类1.land.java (登陆界面)2.system.java (系统管理界面)3...

weixin_33352628的博客 4072

❤️爆肝十二万字《python从零到精通教程》,从零教你变大佬❤️(建议收藏)

文章目录强烈推荐系列教程,建议学起来!!一.pycharm下载安装二.python下载安装三.pycharm上配置python四.配置镜像源让你下载嗖嗖的快4.1pycharm内部配置4.2手动添加镜像源4.3永久配置镜像源五.插件安装(比如汉化?)5.1自动补码神器第一款5.2汉化pycharm5.3其它插件六.美女背景七.自定义脚本开头八、这个前言一定要看九、python入门十、python缩进十一、Python注释1.单行注释2.多行注释十二、Python 变量1.变量定义理解2. 变量名命名3. 分

全栈川川 26万+

一个故事彻底理解 Java 并发

点击上方 "程序员小乐"关注公众号,星标或置顶一起成长每天早上8点20分,第一时间与你相约每日英文Love fight, get treasure, Miss for...

吧主 160

YOLOv13改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计

实时检测器架构的轻量级设计GsConv。

Limiiiing的博客 92

更改训练好的yolo模型中的class类名,无需重新训练

本文介绍了如何在不重新训练YOLO模型的情况下修改其类名的技巧。关键点在于理解YOLO类名存储逻辑:类名列表(names)存储在配置文件中(.yaml),而非权重文件(.pt)。通过修改配置文件的类名列表(保持类别数量nc不变),即可实现类名更新。具体步骤包括:1)准备修改后的配置文件;2)加载模型并更新类名;3)验证推理结果。该方法适用于YOLOv5/YOLOv8等版本,能有效节省开发时间,适用于类名表述调整、多场景复用等需求。注意:增减类别需重新训练,仅修改类名时需确保类别数量一致。

yolo模型训练找我,AI游戏合作找我 890

听完这个故事,彻底搞懂 Java 并发!

最近在给别人讲解 Java 并发编程面试考点时,为了解释锁对象这个概念,想了一个形象的故事。后来慢慢发现这个故事似乎能讲解 Java 并发编程中好多核心概念,于是完善起来形成了这篇文章。...

xmt1139057136的专栏 427

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

一个故事搞懂Java并发编程

  最近在给别人讲解Java并发编程面试考点时,为了解释锁对象这个概念,想了一个形象的故事。后来慢慢发现这个故事似乎能讲解Java并发编程中好多核心概念,于是完善起来形成了了这篇文章。大家先忘记并发编程,只听我给你讲个故事。   故事可能比较奇怪。有这么一个学校,里面有好多好多人,我们简单分成学生、老师、以及宿管阿姨。学校中间还有一个很奇葩的水果超市,里面有个仓库放着苹果、西瓜、橘子。来这...

weixin_33946605的博客 170

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

忘掉 Java 并发,先听完这个故事。。。

最近在给别人讲解 Java 并发编程面试考点时,为了解释锁对象这个概念,想了一个形象的故事。 后来慢慢发现这个故事似乎能讲解 Java 并发编程中好多核心概念,于是完善起来形成了这篇文章。 大家先忘记并发编程,只听我给你讲个故事: 故事可能比较奇怪,有这么一个学校,里面有好多好多人,我们简单分成学生、老师、以及宿管阿姨。 学校中间还有一个很奇葩的水果超市,里面有个仓库放着苹果、西瓜、橘子。...

勇往直前的专栏 227

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

忘掉什么鬼并发,先听完这个故事!

点击上方蓝色“程序猿DD”,选择“设为星标”回复“资源”获取独家整理的学习资料!作者 |闪客sun来源 |cnblogs.com/flashsun/p/11017431.html最近...

程序猿DD 581

一分钟用睡前小故事图解Java线程之死锁

Java线程之死锁深入理解Java线程安全——银行欠我400万!!!一、故事引入 为了更好的理解死锁,读者可能需要了解线程安全相关的知识,主要是对线程执行的六大状态有一定的了解,尤其是阻塞状态,这是死锁发生的关键。进而才能对死锁的过程深入理解。这里附上一篇读前分享链接,当然,你也可以直接跳过。也是可以读懂这篇故事型文章的。 深入理解Java线程安全——银行欠我400万!!! 一、故事引...

LukeyAlvin的博客 7138

忘掉Java并发,先听完这个故事...

点击上方“Java之间”,选择“置顶或者星标”你关注的就是我关心的!来源:www.cnblogs.com/flashsun/p/11017431.html上一篇:最近在给...

Java之间 79

深刻理解JAVA并发中的有序性问题和解决之道

Java并发情况下总是会遇到各种意向不到的问题,比如下面的代码: 线程1中如果发现,那么r1的值等于,否则等于1,然后将结果保存到对象中线程2中先修改,然后设置那大家觉得中的可能是多少呢?r1值等于4, 这个大家都能想到, CPU先执行了线程2,然后执行线程1r1值等于1,这个也容易理解,CPU先执行了线程1,然后执行线程2那我如果说r1值有可能等于0,大家可能觉得离谱,不信的话,我们验证下。由于并发问题出现的概率比较低,我们可以使用提供的框架进行压测,就能够出现各种可能的情况。生成压测工程

程序员旭阳的专栏 481

Java中的锁机制,通过一个故事来讲解一下各种锁的关系和区别。《并发王国》

在一个名为 “并发王国” 的地方,有一座珍贵的 “共享图书馆”,里面存放着王国最核心的知识典籍(共享资源)。为了保护典籍不被混乱翻阅和涂改,历任图书管理员发明了各种 “借阅规则”—— 这些规则,就是 Java 中的各种锁。图书馆刚建成时,来借书的人很少。管理员发明了第一套规则:“登记本” 制度(对应关键字)。偏向锁:熟人免登记最初,每天只有村民小 A 来借书。管理员发现:每次都让小 A 登记太麻烦。于是规定:“只要小 A 来,直接把书给他,登记本上默认写他的名字。”这就是偏向锁的逻辑:当只有一个线程访问共享

2302_80222668的博客 704

爸爸和儿子的故事带你理解java线程

今天回顾线程方面的知识,发现一个很有意思的小程序,是用来说明多线程的下面贴出来分享下,对初学者理解线程有很大的帮助   爸爸和儿子的故事 public class FatherThread extends Thread{ @Override public void run() { System.out.println("爸爸想抽烟,发现

邵鸿鑫 3982

java 爸爸_爸爸和儿子的故事带你理解java线程

今天回想线程方面的知识,发现一个非常有意思的小程序。是用来说明多线程的以下贴出来分享下,对刚開始学习的人理解线程有非常大的帮助爸爸和儿子的故事public class FatherThread extends Thread{@Overridepublic void run() {System.out.println("爸爸想抽烟。发现烟抽完了");System.out.println("爸爸让儿子...

weixin_35965372的博客 186

通过一个故事理解【Java可重入锁-ReentrantLock】的机制

1、听故事把知识掌握了 在一个村子里面,有一口井水,水质非常的好,村民们都想打井里的水。这井只有一口,村里的人那么多,所以得出个打水的规则才行。村长绞尽脑汁,最终想出了一个比较合理的方案,咱们来仔细的看看聪明的村长大人的智慧。 井边安排一个看井人,维护打水的秩序。 打水时,以家庭为单位,哪个家庭任何人先到井边,就可以先打水,而且如果一个家庭占到了打水权,其家人这时候过来打水不用排队。而那些没...

liuwei0376的专栏 209

并发、并行的理解

...

qq_39396379的博客 196

N个例子让你彻底理解java接口回调

说到接口回调,对于初学者来说,理解是真的难啊,不过没有关系,看完本篇文章,你马上就能理解接口回调啦!概念什么是接口回调?用我的理解,就是:A让B去做一件耗时的操作,而且并不知道要花费多少时间,B做完了后,告诉A事情做完了,并且把结果给A。当然,B在做这件事的时候,A还可以做其他事情用途假设有一件耗时的时间,在网上下载一张图片,我们并不知道下载这张图片具体要花费多少时间,于是我们开一个线程去下载图片,

你缺少想象力的博客 6047
上一篇: 聊一聊Java泛型中的通配符 T,E,K,V,?
下一篇: 亿级流量系统架构之如何设计全链路99.99%高可用架构
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值