2016-08-31 64 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可能被認爲是線程安全的。

但是,需要注意的是,如果「本地」對象產生對可變共享狀態(例如可寫靜態字段)的讀/寫操作,線程可能會互相干擾。

相關問題