Java线程并发访问的示例分析
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章给大家分享的是有关Java线程并发访问的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。class ConcurrentThread { /** * 分
千家信息网最后更新 2025年02月23日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安全错误
数据库的锁怎样保障安全
梦间集服务器尚未开启
软件开发公司申请税收
一个网页服务器运算有多快
金融网络安全评测
大专计算机网络技术知识点
wow 宠物数据库
奉化区高科技刀片服务器售后服务
计算机网络技术书评
云南公安机关网络安全执法检查
大数据不能完全替代小数据库
网页注册软件开发
服务器资源管理器一直在加载
羽恋网络技术有限公司
河北新一代网络技术分类优势
优雅的数据库面试
麻花游戏解说2b2t服务器全集
惠普rx6600服务器配置
邯郸网络安全技能竞赛
控制系统软件开发流程
机关网络安全建设方案
如东无忧网络技术排名靠前
计算机网络技术问答题
lol的服务器延迟都很高
楚雄gpu云服务器价格
在线教育软件开发哪家好
南安网络安全大队长
锐龙笔记本软件开发
苏州拼接led大屏服务器
计算机网络技术基本
保险科技软件开发总监