gpt4 book ai didi

java - 方法局部变量存储在哪里?

转载 作者:行者123 更新时间:2023-11-30 08:33:47 27 4
gpt4 key购买 nike

我有一些问题与我们在处理单例对象和并发调用事件时可能遇到的非常具体的情况有关。

我知道还有其他一些问题与我的问题有某种关联,但它们并不是我想知道的。 (例如:Concurrently invoking Java method of singleton object)

例如我有以下代码:

public class MyClass{
private static MyClass myInstance = new MyClass();

private new MyClass() {}

public MyClass getInstance(){
return myInstance;
}

public String doSomething(String message){
java.util.Date d = new java.util.Date();
System.out.println(message);
System.out.println("Today is: " + d);
}
}

在我多次调用同一个类实例的并发场景中,我想知道 Date d 变量发生了什么,在内存方面,它是否会存储在不同的内存堆栈中每个调用 getInstance().doSomething() 的人?

在我的理解中,因为类实例是静态的,但它没有声明可变全局变量,所以它应该为不同的进程创建单独的 d 对象,根本没有并发问题。

有人可以澄清这部分吗?

最佳答案

你是对的。每个线程都有自己的调用堆栈和放置在其上的 d 引用。对象本身分配在堆中,但如果在 escape analysis 期间,JIT 编译器甚至可能将其放在堆栈中变量将被视为局部变量。在您的示例中, d 没有争用,因此 doSomething 可能被认为是线程安全的。

但是您需要记住,如果“本地”对象对可变共享状态(例如可写静态字段)产生读/写操作,则线程可能会相互干扰。

关于java - 方法局部变量存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39260526/

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