2016-08-31 35 views
2

私は、シングルトンオブジェクトと同時呼び出しイベントを扱うときに遭遇する可能性のある非常に具体的な状況に関するいくつかの質問があります。メソッドローカル変数はどこに保存されていますか?

私は何とか私のことに関連する質問があることは知っていますが、私が知りたいと思うものではありません。 (例: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

「シングルトン」と「オブジェクト」はこの質問とは関係ありません。あなたはJavaがローカル変数をどこに置くかを尋ねています。答えは「スレッドスタック」です。 – EJP

答えて

2

あなたは正しいです。各スレッドには独自の呼び出しスタックがあり、d参照が置かれています。ヒープに割り当てられたオブジェクト自身が、escape analysisの変数がローカルと見なされる場合、JITコンパイラはスタックに配置することさえできます。あなたの例では、dには競合がないので、doSomethingはスレッドセーフであると考えられます。

しかし、 "ローカル"オブジェクトが変更可能な共有状態(書き込み可能な静的フィールドなど)への読み取り/書き込み操作を生成する場合、スレッドは互いに干渉する可能性があることに注意する必要があります。

関連する問題