シングルトンパターンの例を実装しようとしています。質問の1つは、それぞれgetInstance()を呼び出す2つのスレッドを実行し、Singletonオブジェクトのインスタンスが1つだけ作成されたことを確認することです。
これが私のシングルトンコードです。
public class OurSingleton {
static OurSingleton ourSingleton;
static int instanceCounter;
private OurSingleton(){
instanceCounter++;
}
public static synchronized OurSingleton GetSingletonInstance(){
if( ourSingleton == null){
ourSingleton = new OurSingleton();
}
return ourSingleton;
}
public static int getCounter() {
return instanceCounter;
}
}
そして私のメイン。
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
OurSingleton mySingleton = null;
Thread one = new Thread(new GetSingletonInstance(mySingleton));
Thread two = new Thread(new GetSingletonInstance(mySingleton));
one.start();
two.start();
System.out.println("Main: " + mySingleton.getCounter());
}
}
class GetSingletonInstance implements Runnable {
int count = 0;
OurSingleton singleton;
public GetSingletonInstance(OurSingleton ourSingleton){
singleton = ourSingleton;
}
@Override
public void run() {
try {
while (count < 5000000) {
singleton.getSingletonInstance();
count++;
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Thread: " + singleton.getCounter());
}
}
このコードを実行すると、次の出力が得られます。
メイン:0スレッド:1スレッド:1
誰かがこの出力の理由を説明できますか?全面的にシングルトンのインスタンスは1つしか存在しないと思いました。これは、別のオブジェクトがスレッドで作成されていることを意味しますか?アドバイスをいただければ幸いです。