方法局部变量存储在哪里?
Where are method-local variables stored?
我有一些问题与我们在处理单例对象和并发调用事件时可能遇到的非常具体的情况有关。
我知道还有其他一些问题与我的问题有些相关,但它们并不是我想知道的。 (示例: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);
}
}
在我多次调用同一个 class 实例的并发场景中,我想知道 Date d
变量发生了什么,在内存方面,它会存储在不同的地方吗每个调用 getInstance().doSomething()?
的人的内存堆栈
根据我的理解,因为 class 实例是静态的,但它没有声明可变全局变量,所以它应该为不同的进程创建单独的 d
对象,根本没有并发问题。
有人可以澄清这部分吗?
你是对的。每个线程都有自己的调用堆栈和放置在其上的 d
引用。对象本身分配在堆中,但如果在 escape analysis 期间变量将被视为本地变量,则 JIT 编译器甚至可以将其放在堆栈中。在您的示例中,d
没有争用,因此 doSomething
可能被认为是线程安全的。
但是您需要记住,如果 "local" 对象对可变共享状态(例如可写静态字段)产生 read/write 操作,则线程可能会相互干扰。
我有一些问题与我们在处理单例对象和并发调用事件时可能遇到的非常具体的情况有关。
我知道还有其他一些问题与我的问题有些相关,但它们并不是我想知道的。 (示例: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);
}
}
在我多次调用同一个 class 实例的并发场景中,我想知道 Date d
变量发生了什么,在内存方面,它会存储在不同的地方吗每个调用 getInstance().doSomething()?
根据我的理解,因为 class 实例是静态的,但它没有声明可变全局变量,所以它应该为不同的进程创建单独的 d
对象,根本没有并发问题。
有人可以澄清这部分吗?
你是对的。每个线程都有自己的调用堆栈和放置在其上的 d
引用。对象本身分配在堆中,但如果在 escape analysis 期间变量将被视为本地变量,则 JIT 编译器甚至可以将其放在堆栈中。在您的示例中,d
没有争用,因此 doSomething
可能被认为是线程安全的。
但是您需要记住,如果 "local" 对象对可变共享状态(例如可写静态字段)产生 read/write 操作,则线程可能会相互干扰。