开发者社区> 问答> 正文

Java多线程的工作内存是什么?:报错

Java的内存模型分为主内存,和工作内存。
主内存是所有的线程所共享的,工作内存是每个线程自己有一个,不是共享的。
线程工作时将要用到的变量从主内存拷贝到自己的工作内存,然后在工作内存中进行读和写。
写完之后,可能没被更新到主内存去。导致其他线程从主内存拷贝数据到自己的工作区时,拷贝的不是最新的数据。这就是内存可见性问题。

那么问题来了,Java的工作内存是什么??
百度 "java多线的工作内存是什么“,看了很多博客都说是各种缓存。
但是缓存不是大家都能访问的吗?

展开
收起
kun坤 2020-06-09 11:08:28 868 0
1 条回答
写回答
取消 提交回答
  • 是我孤陋寡闻,第一次听说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的程序,那么系统就能正确的执行你的多线程程序,而不会做出些改变程序原本的 多线程语义的优化。

    2020-06-09 11:08:34
    赞同 展开评论 打赏
问答分类:
问答地址:
相关产品:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载