gpt4 book ai didi

java - 方法局部变量和栈堆

转载 作者:行者123 更新时间:2023-11-30 05:52:26 26 4
gpt4 key购买 nike

在阅读有关线程安全的文章时,我遇到了这个问题。如果我是正确的方法,本地原语和对象引用位于堆栈中,而堆栈中的引用指向的实际对象位于堆中。

但是当涉及方法本地非原始对象初始化时,这不会导致并发问题吗?我的意思是,如果方法本地非基元存在于堆中并且只有指针存在于堆栈中,那么它与实例变量不一样吗?

谁能帮我理解一下....

附言

想象两个线程,每个线程都有自己的两个堆栈和一个堆。我的理解是,这两个线程将它们的方法局部原始变量保存在它们的堆栈中。我对此没有意见。

但是如果我们有一个带有非原始方法局部变量的方法呢?然后,如果该变量的对象存储在堆中,那么两个线程都可以访问同一个对象,不是吗?因此,如果是这种情况,就会出现同步问题。

这就是我要问的。

谢谢

最佳答案

But what if we have a method with non primitive method local variables ? Then if the object for that variable is stored inside the heap, both the threads will have the access to the same object, won't they ? So if that's the case there would be Sync problems.

我想知道为什么你会认为这两个引用会引用同一个对象。

被引用对象的创建是通过new显式完成的(或者其他类似的方法,但是思路是一样的)

因此,与 C++ 不同,如果您在 Java 中声明它

Foo foo;

没有实例化的 Foo 对象。 foo 只是一个指向任何内容的指针。

这将在堆中为您创建一个 Foo 对象实例。

Foo foo = new Foo();

如果有两个线程在运行这段代码,线程1会在栈中有一个Foo引用,请求在堆中分配一个新的Foo对象,然后将该 Foo obj 的地址分配给引用 foo。线程 2 也在做同样的事情。请注意,线程 2 还要求分配一个新的 Foo 对象,它将与线程 1 分配的对象不同。

这是基本的(并且大大简化了)想法。

关于java - 方法局部变量和栈堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11682616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com