问题描述
JVM的内存管理参见下图既然只有堆区和方法区是各线程共享的,那为什么按照JMM,见下图jvm系统中存在一个主内存,Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(WorkingMemory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。现在问题来了。根据JVM内存管理提到的,只有堆内存和方法区是各线程共享的,那在JMM提到的“主内存”是不是就是指上述2个区域?另外,对于普通int变量是存放在栈中的,那按照JVM的内存管理中说应该是线程独立的,那JMM中的主内存把变量拷贝到工作内存中该如何理解?多谢各位
解决方案
本帖最后由 iamczr 于 2010-11-04 16:33:21 编辑
解决方案二:
该回复于2010-11-05 10:00:09被版主删除
解决方案三:
第一个问题,主内存包括了堆内存和方法区,还应该包括其他所有变量啊。第二个问题,我举例说明:主内存存在变量A=0;线程1:需要用到A,于是把主内存中的变量A复制过来为A',假设操作之后A'=1;线程2:也需要用A,虽然此时线程1中的A'=1,但线程2是从主存中复制的A=0,即线程2中,A''=0。
解决方案四:
区分主内存和副内存(线程工作内存),是为了提高运行效率一般来说,如果没有同步要求,线程运行时,直接使用拷贝到副内存里的变量,要比每次使用时从主内存拷贝,效率要高很多
解决方案五:
我是路过看帖的,顺便拿走每日可用分10分
解决方案六:
过来学习的,顺便拿分,呵呵
解决方案七:
该回复于2010-12-03 10:18:20被版主删除
解决方案八:
没人回答么?
解决方案九:
围观群众
解决方案十:
不是很明白!愿闻其详
解决方案十一:
该回复于2010-11-19 13:49:57被版主删除
解决方案十二:
该回复于2010-11-20 09:58:12被版主删除
解决方案十三:
理解是:每个线程有自己的栈和pc,方法调用通过栈帧的pop和push来实现。栈帧里面有局部变量、操作数等等。这些栈都可以访问一个JVM实例里面的方法区和堆。不知道这样理解对不对,期待大牛。
解决方案十四:
1.所有数据都在主内存中。2.线程运行时从主内存取数据,这里才到栈中,最后刷新回主内存(同多CPUcache模型),JAVA语言规范定义了6个原子操作:load,save,read,write,use,assign,用于线程内存同步。如果有synchronized,每个同步变量的操作先上锁-->read-->use/assign-->write-->解锁,完成同步过程。如果没有synchronized,不会上锁,都在线程本地操作,不保证数据的一致性。
解决方案十五:
该回复于2010-12-30 13:33:04被版主删除
解决方案:
过来学习的,顺便拿分,呵呵
解决方案:
ipnu天天学习
解决方案:
不太懂就谦虚点,网上和书上找来的,都每个人说清楚的;文字几经一样,浪费时间;都不想发帖问这些问题,基本上大陆没人知道;译书,写书的都不例外;哈哈!有点愤青,但是网络上的现实摆在面前,就是在抄文字,懂不懂都在抄/转;
解决方案:
哥想挨骂,都把哥搞火了,网上那些转帖,改贴的都烦透了;赚人气/赚积分却不认真处理问题的吃屎去吧!
解决方案:
推荐你看几个文章:JLS第三版第17章——权威之作jsr133——JMM规范
解决方案:
引用
jvm系统中存在一个主内存,Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(WorkingMemory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。
1.主内存是什么?2.变量是那些变量,全部的变量?3.变量是怎样存储在主存中(怎么存入,取出(不同变量特征都不一样吧),什么样的分布情况);4.线程是否是说线程对象,从上文中表述,超出了对象的特性了,到底是个什么东西呢?5.线程为什么要拷贝,拷贝谁,怎么拷贝;总之.请不要千遍一律地说线程共享了主内存就导致了不安全,当明白了线程共享主内存的前前后后的相详细,当然就能明白是不安全的啦;不是随便在网上乱骂的,刚好找到个在问这些问题的了,还有一大把人不明白;
解决方案:
喔,图还蛮多的
解决方案:
这样的问题讨论有什么意思啊!!你们哪些人工作中遇到过这些???