質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

2回答

295閲覧

デザインパターン・シングルトンのメカニズムが分からない

KasperHekmatyar

総合スコア81

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/07/13 08:52

###前提・実現したいこと

①デザインパターン・シングルトンの仕組みがよくわからないです。以下のプログラムを実行するとコンソールには10回同じ値が表示されるらしいのですが、どうしてそうなるのでしょうか? また、表示されている値は何なのでしょうか? ②if (_instance == null)とありますが、_instanceを宣言時に=nullと宣言していないので、 ifの条件文は必ずfalseになると思ったのですが、どうしてそうならないのでしょうか? また、ExerciseSingleton型 変数名_instanceとあるのですが、これは参照型の中のクラス型に 分類されるという意識で宜しいでしょうか? ③_instance = new ExerciseSingleton()により_instanceにはExerciseSingleton()が代入されているので、for文の2回目の処理時には_instanceはすでにnullではないと思っているのですが、合ってますでしょうか? ④private volatile static ExerciseSingleton _instance;とあり、直訳するとこのクラス 型の変数になると思うのですが、イメージが出来ないです。どのように捉えれば宜しいのでしょうか? ⑤メソッドの戻り値がこのクラスの型となっていますが、これもうまくイメージする事ができないです。どのように捉えれば宜しいのでしょうか? ⑥if (_instance == null)を2回使用していますが、機械は人間ではないので、同じ事を聞くという再確認をしなくても計算ミスをしないと思うのですが、なぜこれを2回も書くのでしょうか?

###コンソールの表示

exercise_java_class02.ExerciseSingleton@3d4b7453 exercise_java_class02.ExerciseSingleton@3d4b7453 exercise_java_class02.ExerciseSingleton@3d4b7453 exercise_java_class02.ExerciseSingleton@3d4b7453 exercise_java_class02.ExerciseSingleton@3d4b7453 exercise_java_class02.ExerciseSingleton@3d4b7453 exercise_java_class02.ExerciseSingleton@3d4b7453 exercise_java_class02.ExerciseSingleton@3d4b7453 exercise_java_class02.ExerciseSingleton@3d4b7453 exercise_java_class02.ExerciseSingleton@3d4b7453

###該当のソースコード

java

1public class ExerciseSingleton { 2 3 /** 4 * 5 */ 6 private ExerciseSingleton() { 7 // TODO 自動生成されたコンストラクター・スタブ 8 } 9 10 /** 11 * @param args 12 */ 13 14 // 本クラス唯一インスタンス 15 16 private volatile static ExerciseSingleton _instance; 17 18 public static ExerciseSingleton getInstance() { 19 20 if (_instance == null) { 21 22 // 他のプログラム(クラス)からのアクセスを不可にする 23 // ワードで言う編集中なので、他の人は編集不可な状態の宣言 24 25 synchronized (ExerciseSingleton.class) { 26 27 if (_instance == null) { 28 29 _instance = new ExerciseSingleton(); 30 31 } 32 } 33 } 34 return _instance; 35 } 36 37 public static void main(String[] args) { 38 // TODO 自動生成されたメソッド・スタブ 39 40 for (int i = 0; i < 10; i++) { 41 42 System.out.println(ExerciseSingleton.getInstance()); 43 44 } 45 46 } 47 48}

###補足情報(言語/FW/ツール等のバージョンなど)
java1.6 eclipse mars

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

  1. 表示されてる値は、ObjectのtoStringの結果です。

ぶっちゃけ、あまり気にしなくてよいです。
2. maisumakunさんの説明通り。new したものを宣言していないのでnullです。
3. 認識はあっています。double-checked locking というイディオムですが、javaでは推奨されません
4. volatileは気にしなくてよいです。
5. コンストラクタをprivateにしているため、他のクラスからnewできないようにしています。
多少の間違い恐れずに言うなら、要はnewの代わりです。
6. double-checked locking というイディオムですが、javaでは推奨されません

Javaのシングルトンについては、以下が詳しいので目を通すことをおすすめします。
古いので、いまとはJVMの仕様・実装が異なる可能性あるかもですが、どなたかツッコミお待ちしてます。

IBM Developerworks:double-checked lockingとSingletonパターン

要約

プログラマーたちは、Singletonで高コストな同期化を回避するために、工夫を凝らして、double-checked lockingイディオムを考案しました。残念ながら、このイディオムが、現行のメモリー・モデルが原因で安全なプログラミング構成概念ではないことが明らかになったのは、これがかなり広く使われるようになった後のことでした。メモリー・モデルの、ぜい弱な部分を改良するための努力が行われています。しかし、新しく提案されたメモリー・モデルでも、double-checked lockingは通用しません。この問題に対する最良の解決策は、同期化を受け入れるか、あるいはstatic field を使用することです。

投稿2017/07/13 10:34

編集2017/07/13 11:08
momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ややこしそうな部分だけ解説します。

if (_instance == null)とありますが、_instanceを宣言時に=nullと宣言していない

初期化子なしの場合、Javaの参照型変数の初期値はnullです。

if (_instance == null)を2回使用していますが、機械は人間ではないので、同じ事を聞くという再確認をしなくても計算ミスをしないと思うのですが、なぜこれを2回も書くのでしょうか?

途中に入っているsynchronizedがポイントで、getInstance()を別スレッドから同時に呼んだ場合、synchronizedブロックが複数回実行される危険性がありますので、synchronizedの中と外の両方でチェックが必要となります。メソッド全体をsynchronizedにしても動くことは動くのですが、インスタンス生成をしない場合にはsynchronizedが不要なので、余計なコストとなります。

投稿2017/07/13 08:59

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問