Java线程并发访问的示例分析
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章给大家分享的是有关Java线程并发访问的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。class ConcurrentThread { /** * 分
千家信息网最后更新 2025年01月16日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安全错误
数据库的锁怎样保障安全
风铃档案可以换服务器吗
紫米手机软件开发
数据库学习入门书籍下载
昌平区网络技术咨询优点
汽车车载网络技术题库
郑州软件开发招人
数据库故障类型如下 ()
网络安全基地征兵
服务器上mysql数据库
数据库与网站建设视频教程
软件开发 体检要求
Devil网络安全团队
怀柔区综合软件开发质量保障
江苏个人软件开发业务流程
首份网络安全报告
网络安全保障中心是事业单位吗
网络安全培训班的重要性
广州探途网络技术有限公司法务
艾尔登法环服务器登录不上
网易我的世界开服务器
英国网络安全委员会
电脑服务器非常繁忙
ps4服务器联机
海南ai服务器什么价位
通信网络技术ppt展示
mysql远程数据库连接
数据库中的三范式
泗洪自动化网络技术市场
畅言网络安全
mt4哪个服务器快