java堆内存被所有线程所共享,不明白2个线程如何共享2个对象中的同名变量。

classdemoimplementsRunnable{intcount=0;publicvoidshow(){intcount=0;}}publicclassdemo1... class demo implements Runnable
{
int count=0;

public void show()
{
int count=0;
}

}
public class demo1
{
public static void main(string[] args)
{
Thread S1=new Thread(new demo());

Thread S2=new Thread(new demo());
}
}
视频里的老师说,count定义在成员上就被下面S1和S2两个线程所共享,2个线程同时操作一个count因为在成员上count就在堆内存中存在。只有定义在方法里(局部变量),才会被2个线程分别操作。但我理解的是创建对象岂不是已经在堆内存存在2个对象了吗?每个对象里都有count,那意味着堆内存中存在2个count,且分别在2个对象中。那么这两个线程按道理应该是操作不同的count才对。我想我的理解应该是出问题了,不知道有没有高人能够帮忙指点迷津。谢谢!(PS:因为为了针对问题,例子写的非常简单,请见谅)
展开
 我来答
小小卖报郎
2018-08-29
知道答主
回答量:36
采纳率:0%
帮助的人:8.1万
展开全部
首先:堆内存共享是相对于栈内存的。栈是每一个线程都独有的,线程之间互不一向,每一个线程都有自己的栈内存。但是堆内存不一样,在一个JVM实例里面,不管你有多少线程,创建了多少对象,都是放在一块堆内存的。也就是说一个JVM实例栈内存区域是有多个,每一个线程持有一个,而堆内存只有一个,是线程共享的。
其次:针对你这个代码,这个情况下每一个线程确实是对应着不同的对象。也就是在同一个堆(也只有一个堆)里面创建了两个Demo对象。你老师的意思应该是
Demo demo = new demo();
Thread S1=new Thread(demo);
Thread S2=new Thread(demo);
这样两个线程都是操作堆内存共享的对象。
459402930
推荐于2016-11-25 · TA获得超过444个赞
知道小有建树答主
回答量:292
采纳率:83%
帮助的人:177万
展开全部
Thread S1=new Thread(new demo());
Thread S2=new Thread(new demo());
你是这样写的, new demo() 你调用了两次, 会生成两个 demo对象,每个线程都会去操作对应对象的 count. 这是 两个线程 操作 两个 count, 中间互不影响。
demo d=new demo();

Thread S1=new Thread(d);
Thread S2=new Thread(d);
如果这样的话, 两个线程操作的是同一个count
追问

文字太长,只能以图片发出来了

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
时代小超人
2019-07-05
知道答主
回答量:24
采纳率:0%
帮助的人:7.8万
展开全部
一楼回答的正确
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小小司舒音dQ
2018-09-15
知道答主
回答量:2
采纳率:0%
帮助的人:1537
展开全部
作者带偏了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式