
180
5
章
マルチスレッドと
Singleton
マルチスレッドを扱う
以下のようにgetInstance()を同期メソッドにすれば、マルチスレッドの問題
は簡単に解消します。
getInstance()
に
synchronized
キーワードを
追加すると、すべてのスレッドはこのメソッド
に入る順番を待ちます。つまり、
2
つのスレッ
ドが同時にこのメソッドには入れないのです。
よい点に気がつきましたね。実際には、事態はあなたが考えて
いるより少し深刻です。同期化が関係するのは、このメソッド
の初回実行時だけです。言い換えれば、一度
uniqueInstance
変
数に
Singleton
のインスタンスを設定してしまえば、以降はこの
メソッドを同期化する必要はありません。つまり初回実行時以
降は、同期化は全く必要のないオーバーヘッドなのです!
これで問題は解決すると思
うよ。だけど、同期化はコスト
が高いよね。これは問題では?
public class Singleton {
private static Singleton uniqueInstance;
//
他の便利なインスタンス変数をここに宣言
private Singleton() {}
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance; ...