我读到了方法的执行方式,这就是我的理解: 1)方法在方法区域中分配存储器,并且仅维护单个副本,该副本用于所有类的实例。 2)当从一个实例调用一个方法然后当前线程(单线程env)说main被加载然后堆栈加载了通过instance.eg调用的方法:
main(String ags[])
{
A a = new A();
a.method();
}
// code of method
method()
{
for(int i=0;i<25;i++)
system.out.println(i);
}
所以对于这个线程,它有自己的调用堆栈,然后在方法调用上,同样的方法体及其局部变量被推送到main方法上面的同一堆栈上。
现在基于以上理解,我不明白的是,在多线程环境中,如果我运行两个线程,相同的代码将如何表现 并且两者共享同一个实例。例如:
//My run method for myRunnable
run()
{
a.method();
}
Thread one = new Thread(new myRunnable(a)); // object from above
Thread two= new Thread(new myRunnable(a));
现在,当两个线程开始执行时,它们将拥有自己的调用堆栈。
在这种情况下,共享对象的方法将如何执行?。
由于
答案 0 :(得分:1)
1)方法在方法区域中分配存储器,并且仅维护单个副本,该副本用于所有类的实例&gt;&gt;这意味着方法实现的字节码只是每个实例的一个。并且方法字节码存储区域与对象的堆分开。
每个线程当然都有自己的堆栈,就像你解释一样。
答案 1 :(得分:1)
如果有多个线程同时在同一个对象上运行相同的方法,则会出现以下情况:
局部变量存储在每个线程的堆栈中。它们不是共享的,也不会发生冲突。
对象实例(this
)存储在堆上,以及其所有字段(例如this.foo
)。堆是共享的。为确保正常工作,您必须根据需要应用线程同步机制。
static
字段也是共享的,访问也必须协调
在您的示例中,循环中的i
是局部变量。两个线程将按顺序打印所有数字(但两个线程的输出以未定义的顺序交错)。
答案 2 :(得分:0)
好的,你走进一个房间。
有人递给你一个剪贴板,一支铅笔和一块白板标记,然后 告诉您开始按照某些特定的说明开始 墙上的海报。
另一面墙上有一块白板:它看起来像一个带行的电子表格 和列,以及在单元格中写入的数字和单词。你的剪贴板有一个 有更多行和列的纸张,并写入一些数字 铅笔中的一些细胞。
说明书将逐步告诉您如何执行某些复杂的操作 计算。他们说的是,
SELECT DISTINCT id,
name
FROM people
INNER JOIN
(SELECT people_id
FROM groups_have_people
WHERE groups_id=123
UNION SELECT phf.people_id
FROM people_have_friends phf
INNER JOIN groups_have_people ghp ON ghp.people_id=phf.people_id
WHERE ghp.groups_id=123) x ON x.people_id=people.id;
剪贴板上有一个空间,您可以在其中编写自己的笔记。您可以 例如,使用它来跟踪你所处的步骤或其他任何步骤 你需要记住才能完成工作。
墙上还有其他海报,还有其他人,每个都有 他/她自己的剪贴板。有些人正在遵循指示 和你一样的海报,其中一些正在阅读其他海报。 每个人都在阅读/写入同一个白板。
每个人都按照自己的节奏行事。阅读相同的人 海报,因为你不一定和你在同一个步骤,因为每一个 你在剪贴板上写了不同的初始数字,你甚至可能没有 以相同的顺序执行指令。
这是一个简单的多线程计算模型:海报上的海报 墙是方法,白板是堆,人是线,和 你的剪贴板就是你的堆栈。
它也与科学/工程计算的大致相似 在工业时代完成。做那种工作的人是 被称为“电脑”。
如果你正在协调整个事情,并且是时候添加一个新的“线程”(即,当一个新的志愿者走进房间时),那么你需要给那个人他/她自己的剪贴板(堆栈),有自己的初始值(参数),但你没有给新人一张她/他自己的海报(方法):你只需将她/他指向一张已经在墙上的海报。 / p>