Java线程并发访问的示例分析
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章给大家分享的是有关Java线程并发访问的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。class ConcurrentThread { /** * 分
千家信息网最后更新 2025年11月07日Java线程并发访问的示例分析
这篇文章给大家分享的是有关Java线程并发访问的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
class ConcurrentThread { /** * 分析线程并发访问代码解释原因 * volatile关键字: * 1):保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的 * 2):禁止进行指令重排序 * volatile本质是告诉JVM当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取 */ private volatile int count = 0; public void inc() { try { Thread.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } count++; } @Override public String toString() { return "[count=" + count + "]"; }}//----------------------------------------public class VolatileTest { public static void main(String[] args) { final ConcurrentThread counter = new ConcurrentThread(); for (int i = 0; i < 1000; i++) { new Thread(new Runnable() { @Override public void run() { counter.inc(); } }).start(); } System.out.println(counter); }}
原因解释:在Java的内存模型中每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息
当线程访问某一个对象值得时候:
1、通过对象的引用找到对应在堆内存的变量的值
2、把堆内存变量的具体值load到线程本地内存中,建立了一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。这样堆中的对象的值就产生变化了。
结合上例,也就是说上面主函数中开启了1000个子线程,每个线程都有一个变量副本,每个线程修改变量只是临时修改了自己的副本,当线程结束时再将修改的值写入在主内存中,这样就出现了线程安全问题(拿到了主内存中过时的变量值),因此结果就不可能等于1000了,一般都会小于1000.

感谢各位的阅读!关于"Java线程并发访问的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
线程
变量
内存
副本
对象
分析
量值
示例
内容
原因
时候
更多
篇文章
解释
运行
不同
不错
实用
过时
安全
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
区块链是下一代网络技术
数字福建云服务器
前锦网络技术架构
苹果软件开发工程师
服务器u位
特斯拉服务器ios
家庭网络可以加个服务器吗
sas软件开发多少钱
完美国际中原电信凌云服务器
app软件开发后迭代
荣耀系统服务器在哪里
惠州家政软件开发哪家好
小型服务器辐射大吗
8.26光遇显示连接服务器失败
软件开发的发展目标
数据库查询显示前10条数据
数据库中删除表名的语句
软件开发的产品计入什么科目
系统集成和网络技术有关系吗
软件开发流程实验报告
山东网络安全应急服务支撑单位
歌曲服务器
服务器机房运维面试
数据库产品开源化
计算机软件开发客户活动
软件开发课程设计心得
阿里云服务器搭建教程
华三cas服务器配置哔哩哔哩
数据库中关系代数的连接
数据库锁_索引