java 置换_java置换规则

本文探讨了Java内存模型中的工作内存概念,解释了线程如何从主内存读取数据到CPU寄存器,以及在多线程环境下可能出现的数据竞争问题。线程拥有自己的工作内存,包括栈区,其大小可通过JVM参数-Xss设定。工作内存是线程私有的,避免数据竞争需要使用锁等同步机制。理解Java内存模型对于编写线程安全的代码至关重要。
摘要由CSDN通过智能技术生成

是我孤陋寡闻,第一次听说java的内存模型的工作内存,我猜你是想说本地内存吧!计算机的工作方式是基于冯诺依曼结构的,从磁盘读取数据到内存,再从内存读取数据到cpu内部的三级,二级,一级最后到达寄存器。java中的多线程的主内存就是内存上面的jvm堆,程序在运行时的线程所要的数据都是来自内存,读取并最终传入cpu内部寄存器,每个cpu内部都有各自的一套完整寄存器,cpu只能直接操作这些存储,比如cpu的加法指令吧两个寄存器里面的数据加起来放入其中一个或者地三个寄存器,计算的结果如需要保存,cpu需要另一个指令吧数据传输到数据总线并保存到内存,最终写回磁盘。在这个过程中,内存数据可能被多个线程同时读取,并在cpu内部形成私有的拷贝,就是本地内存(内存的cpu内部本地副本)在线程中体现在线程栈区,正是这种分步多指令实现一个操作,在多线程被调度置换过程中数据被多个线程操作,造成数据竞争,所以数据经常用到锁等手段实现同步。     上面从硬件的实现角度看,从软件的角度看,线程可访问的数据就分共享数据,和私有数据,这个在不同的计算机编程语言中体现都不一样,比如java中的类属性就可以是共享的也可以是私有的,当这个类的实例是在方法内部创建的,那属性就是线程私有的,因为整个对象都是线程私有的,如果该对象被传到线程中的方法,该对象就是共享的。这个界限就看数据是在哪里产生和多线程可访问性;线程防范内部产生并不被方法外部可访问的数据都是私有数据,多线程编程称为线程安全。相反线程不安全。 ###### JVM会为每个线程申请线程栈,那就是每个线程的内存。  在JVM参数中由-Xss设定大小。

###### 这个问题,可能表述差别,还有个人理解不一样。我说下自己的理解: 从操作系统上讲:线程分TCB(控制区),核心区,用户区,还有工作区。其中TCB,核心区,用户区一般都是常驻内存的(用户区有时不在内存)。工作区由线程自由操作。 fork时子线程复制父线程的所有区域。因为TCB(控制区),核心区,用户区都是常驻内存的,所以很多博客都说是各种缓存(我猜的)。而自己有自己的工作区,不是共享的。 “java多线的工作内存” 我的理解是整个线程的内存(TCB,核心区,用户区,工作区),大部分来自父线程,而大部分来自主存,也可以说缓存。 "java线程的工作区域" 就是上面说的工作区,自己的,不共享。 而且我觉得这个和语言无关,就是操作系统里面讲的。

######多线程内存就像是程序员写的代码和编译器、虚拟机(例如JVM)、CPU等可能对代码进行修改的系统模块间的契约,只要程序员按照这个模型定义的规则来编写没有data race的程序,那么系统就能正确的执行你的多线程程序,而不会做出些改变程序原本的 多线程语义的优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值