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

时间:2016-08-31 23:27:29

标签: java concurrency local-variables

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

我知道还有其他一些与我有关的问题,但它们并不是我想知道的。 (例如: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对象,而根本没有并发问题。

有人可以澄清这部分吗?

1 个答案:

答案 0 :(得分:2)

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

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