多线程安全与通信问题
线程安全问题当多个线程操作读/写同一份数据时可能会出现线程安全问题进程的内存图如图所示在代码运行时每一个线程并不会对堆内存中的变量本身进行操作而是先复制一个副本放在本地变量表中加载到自己的工作内存中随后对这个副本进行操作操作完毕后再将这个副本的内容赋给堆内存中的对象本体。出现线程安全问题的原因CPU在进行操作时并不是一个线程完全执行完在进行下一个而是为了提高CPU的计算效率防止CPU将大部分时间浪费在等待上采用时间片轮转的方法即每个线程执行一小段时间就换下一个的方式来计算。在这种情况下执行count的操作时线程1和线程2会对堆内存中的数据不停的进行修改而且会不停的覆盖对方的计算结果导致计算结果不准确引发线程安全问题。代码模拟如下packagecom.nwu.by0204_ThreadSafe;classThreadDemo2extendsThread{Overridepublicvoidrun(){for(inti0;i10000;i){ThreadDemo1.count;}}}publicclassThreadDemo1extendsThread{staticintcount0;Overridepublicvoidrun(){for(inti0;i10000;i){count;}}}classMain{publicstaticvoidmain(String[]args){ThreadDemo1threadDemo1newThreadDemo1();ThreadDemo2threadDemo2newThreadDemo2();threadDemo1.start();threadDemo2.start();try{Thread.sleep(1000);}catch(InterruptedExceptione){thrownewRuntimeException(e);}System.out.println(ThreadDemo1.count);}}代码中用到的static关键字static意思是静态的静态变量只在类加载的时候获取一次内存空间因此代码中的任何对象的修改都会被保留。同时静态变量的访问需要用类名来访问。代码中使用sleep方法的解释线程的进行需要时间在调用线程对象的start方法后程序会立即打印输出语句此时的线程还处于就绪状态因此此时打印出来的count就是0。解决方案使用sleep方法让程序等待一秒在打印count的值运行结果如下结果并非是预期的20000这就是线程的安全问题。线程安全问题的解决方案原子性一个或多个操作要么在执行时不会被打断要么就不执行原子操作不会被线程调度所打断的操作可见性当多线程访问同一变量时一个线程修改该变量的值另一个线程能立刻看见修改的值为了保证可见性可以给变量加一个修饰词volatile加上这个关键字后这个变量就具备了可见性为了保证线程安全Java中有内置锁synchronized 同步锁synchronized(){ }参数 必须是一个当前所有线程都可以访问的唯一对象当前线程在执行代码块中的内容时其他所有线程必须等待直到代码块中的内容执行完毕等代码块执行完成后会解锁其他线程继续与该线程进行竞争代码修改方案给两个线程的run方法里要执行的代码都加上一把synchronized同步锁即可同时还需要在new一个静态的对象让两个线程都可以访问packagecom.nwu.by0204_ThreadSafe;classThreadDemo2extendsThread{Overridepublicvoidrun(){synchronized(ThreadDemo1.obj){for(inti0;i10000;i){ThreadDemo1.count;}}}}publicclassThreadDemo1extendsThread{staticintcount0;staticObjectobjnewObject();Overridepublicvoidrun(){synchronized(obj){for(inti0;i10000;i){count;}}}}classMain{publicstaticvoidmain(String[]args){ThreadDemo1threadDemo1newThreadDemo1();ThreadDemo2threadDemo2newThreadDemo2();threadDemo1.start();threadDemo2.start();try{Thread.sleep(1000);}catch(InterruptedExceptione){thrownewRuntimeException(e);}System.out.println(ThreadDemo1.count);}}执行结果代码的最终优化在源代码中为了保证线程执行完后在进行打印输出语句采用的方法是调用Thread类中的sleep方法让程序停一秒等待线程执行。更规范的做法是采用join()方法join方法是Thread类中的实例方法它的作用是让其他线程都要等待这个线程执行完毕后在进行下一步操作需要在start方法后执行。采用join方法而不是sleep方法的好处sleep方法是我们人为的猜出一个等待方法规定程序需要等待多少ms而join方法是系统自己判断的只要该线程执行完毕就可以开始下一个线程比认为规定更加精准、规范代码修改后packagecom.nwu.by0204_ThreadSafe;classThreadDemo2extendsThread{Overridepublicvoidrun(){synchronized(ThreadDemo1.obj){for(inti0;i100000;i){ThreadDemo1.count;}}}}publicclassThreadDemo1extendsThread{staticintcount0;staticObjectobjnewObject();Overridepublicvoidrun(){synchronized(obj){for(inti0;i100000;i){count;}}}}classMain{publicstaticvoidmain(String[]args){ThreadDemo1threadDemo1newThreadDemo1();ThreadDemo2threadDemo2newThreadDemo2();threadDemo1.start();threadDemo2.start();try{threadDemo1.join();threadDemo2.join();}catch(InterruptedExceptione){thrownewRuntimeException(e);}System.out.println(ThreadDemo1.count);}}在修改后的代码中只有把threadDemo1和threadDemo2两个线程都执行完才会进行下一步两个线程是并行等待的也就是执行输出语句。比人为规定sleep时间更精准、更规范运行截图

相关新闻

[信息论与编码理论专题-17]:信息熵是信源进行无损编码时,平均码长所能达到的理论下限。各事件的概率决定了其在最优变长编码(如霍夫曼编码)中的码长:概率越大,码长越短;概率越小,码长越长。

[信息论与编码理论专题-17]:信息熵是信源进行无损编码时,平均码长所能达到的理论下限。各事件的概率决定了其在最优变长编码(如霍夫曼编码)中的码长:概率越大,码长越短;概率越小,码长越长。

这句话完全正确、表述精准、术语规范,准确概括了香农信息论中关于熵与无损编码关系的核心结论,可直接用于教学、教材或技术文档。为便于理解与传播,这里稍作结构优化与补充说明(非修正,仅为增强)&#xff1…

2026/7/4 11:40:29 阅读更多 →
【课程设计/毕业设计】基于NodeJS大学生二手交易平台基于nodejs的校园二手市场的设计与实现【附源码、数据库、万字文档】

【课程设计/毕业设计】基于NodeJS大学生二手交易平台基于nodejs的校园二手市场的设计与实现【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/3 14:39:29 阅读更多 →
解析muduo源码之 Poller.h  Poller.cc

解析muduo源码之 Poller.h Poller.cc

目录 一、 Poller.h 1. Poller 类的整体定位与核心设计目标 2. 核心成员变量解析 1. 私有成员:所属 EventLoop(线程安全核心) 2. 保护成员:fd 到 Channel 的映射(核心管理结构) 3. 公共类型别名&…

2026/7/3 14:39:31 阅读更多 →

最新新闻

跨架构物联网漏洞挖掘:统一IR与动静结合分析实践

跨架构物联网漏洞挖掘:统一IR与动静结合分析实践

1. 项目概述:为什么我们需要“跨架构”的物联网漏洞挖掘?干了这么多年安全,尤其是物联网这块,我最大的感受就是“乱”。你面对的从来不是单一平台,而是ARM、MIPS、x86、RISC-V,甚至各种魔改的MCU架构大杂烩…

2026/7/5 9:12:35 阅读更多 →
热红外视觉下的车辆/船舶重识别新方法:Vc-fes

热红外视觉下的车辆/船舶重识别新方法:Vc-fes

在监控与海事安防等场景中,如何在**热红外图像**(灰度、无色彩、纹理弱)中准确识别同一辆车或同一艘船,是一个长期悬而未决的难题。近期发表于《International Journal of Machine Learning and Cybernetics》(2026年)的论文《Vc-fes: viewpoint-conditioned feature selection…

2026/7/5 9:10:34 阅读更多 →
本地AI完全指南①:我把ChatGPT退了,一年省2400——为什么越来越多人把大模型搬回家

本地AI完全指南①:我把ChatGPT退了,一年省2400——为什么越来越多人把大模型搬回家

title: 本地AI完全指南①:我把ChatGPT退了,一年省2400——为什么越来越多人把大模型搬回家? tags: 本地AI,私有大模型,Ollama,DeepSeek,大模型部署,AI隐私,离线AI,本地部署大模型,DeepSeek本地部署 category: 人工智能 本地AI完全指南①&…

2026/7/5 9:10:34 阅读更多 →
同一个模型,三个平台:OpenRouter - SiliconFlow - DeepInfra 实测对比

同一个模型,三个平台:OpenRouter - SiliconFlow - DeepInfra 实测对比

前面几期测的都是模型官方 API。但你实际用的时候,大概率走的不是官方——而是通过某个聚合平台。 为什么?几个现实原因: 不想每个模型绑一张信用卡公司采购要求统一结算官方 API 在某些地区不稳定想用一个 API Key 调所有模型 所以这期我不测…

2026/7/5 9:10:34 阅读更多 →
GRPO训练燃料:把Hermes Agent Feedback变成强化学习信号

GRPO训练燃料:把Hermes Agent Feedback变成强化学习信号

GRPO训练燃料:把Agent Feedback变成强化学习信号 「Hermes Agent自进化智能体深度解析」系列 | 模块十六 第3篇 你的Agent积累了1000条执行轨迹。500条成功,500条失败。成功的路径有的快、有的慢,失败的失败方式各不相同。你盯着这些数据&a…

2026/7/5 9:08:34 阅读更多 →
艾尔登法环mod下载法魂Modv3.0安装指南

艾尔登法环mod下载法魂Modv3.0安装指南

法魂Mod是一款热度突破680万、持续更新超过三年的《艾尔登法环》大型大修模组。3.0版本带来了全新宝珠系统、大量原创武器与法术、DLC区域地图重置等重大更新,并兼容无缝联机与光荣商人等主流功能性模组。以下为完整安装流程与多Mod共存配置方法。 版本核心更新内容…

2026/7/5 9:08:34 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻