2016-08-31 36 views
2

我在处理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); 
    } 
} 

在并发场景中,我调用这个相同的类的实例很多次,我想知道发生了什么日期d变量,内存明智,它会被存储在不同的内存堆栈,每个人调用getInstance()。doSomething()?

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

有人能澄清这部分?

+1

'Singleton'和'object'与这个问题无关。你问的是Java把局部变量放在哪里,答案是'在线程栈上'。 – EJP

回答

2

你说得对。每个线程都有自己的调用堆栈,并在其上放置参考文献d。如果在escape analysis变量被认为是本地的,那么对象本身在堆中分配,但是JIT编译器甚至可以将它放置在栈上。在你的例子中,没有对d的争用,所以doSomething可能被认为是线程安全的。

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

相关问题