Javaのsynchlonizedブロックについての質問です。
http://gomyownway.hatenablog.com/entry/2012/08/30/234602
こちらを参考にしました。
Java
1public class TestThread2 { 2 public static void main(String[] args){ 3 final Kanojyo kanojyo = new Kanojyo(); 4 new Thread(){ 5 public void run(){ 6 System.out.println("スレッド-"+Thread.currentThread().getName()+"が走っています"); 7 8 //彼女pブジェクとのロックを取得する 9 synchronized(kanojyo){ 10 //sleepしてみる 11 try{ 12 //ロックを取得したので優雅に2秒間待って・・・ 13 System.out.println(Thread.currentThread().getName()+"は待機中です・・・"); 14 sleep(2000); 15 }catch(InterruptedException e){} 16 17 //彼女の名前をセットする 18 kanojyo.setKanojyoName("Shiho"); 19 System.out.println("彼女の名前をセットしました"); 20 } 21 } 22 }.start(); 23 24 new Thread(){ 25 public void run(){ 26 try{ 27 //上で彼女をロックする前にこっちがロックを取得するのは困るので、一瞬待機 28 sleep(20); 29 } catch(InterruptedException e){} 30 System.out.println("スレッド-"+ Thread.currentThread().getName()+"が走っています"); 31 //いくらスレッドが走っても、ロックを取られているので、setが終わるまでgetKanojyoName()は実行できない 32 synchronized(kanojyo){ 33 System.out.println("彼女の名前は"+kanojyo.getKanojyoName()); 34 } 35 } 36 }.start(); 37 } 38} 39 40class Kanojyo{ 41 private String name = null; 42 43 public void setKanojyoName(String name){ 44 this.name = name; 45 } 46 47 public String getKanojyoName(){ 48 return name; 49 } 50}
実行結果は、
スレッド-Thread-0が走っています
Thread-0は待機中です・・・
スレッド-Thread-1が走っています
彼女の名前をセットしました
彼女の名前はShiho
のようになります。
上のコードで対象インスタンス(synchlonizedブロックのカッコで囲まれた部分のことです)をkanojyoからthisに変更すると、実行結果は変わってしまいます。
よって、対象インスタンスのロックを獲得しているスレッドのみが対象インスタンスのメンバにアクセスできるのだと考えています。
しかしながら、以下のようなコードではクラス内でインスタンスを作って、それを対象インスタンスとしています。
これって意味あるのでしょうか?
Java
1class Display { 2 private static HashMap _classnameToInstance = new HashMap(); 3 private static Object _lock = new Object(); 4 protected Display() { 5 synchronized (_lock) { 6 String classname = this.getClass().getName(); 7 if (_classnameToInstance.get(classname) != null) { 8 throw new RuntimeException("Already created: " + classname); 9 } 10 _classnameToInstance.put(classname, this); 11 } 12 } 13 public static Display getInstance(String classname) { 14 synchronized (_lock) { 15 Display obj = (Display)_classnameToInstance.get(classname); 16 if (obj == null) { 17 try { 18 Class cls = Class.forName(classname); 19 obj = (Display)cls.newInstance(); 20 } catch (ClassNotFoundException e) { 21 throw new RuntimeException(classname + " is not found"); 22 } catch (IllegalAccessException e) { 23 throw new RuntimeException(classname + " cannot be accessed."); 24 } catch (InstantiationException e) { 25 throw new RuntimeException(classname + " cannot be instantiated."); 26 } 27 } 28 return obj; 29 } 30 } 31 public void display(String msg) { 32 System.out.println("Display: " + msg); 33 } 34}
こちらのコードは
http://www.hyuki.com/techinfo/singleton.html
を参考にしています。
回答お願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/09/07 14:26
2016/09/07 14:37
2016/09/07 14:58
2016/09/07 15:22
退会済みユーザー
2016/09/08 13:47
2016/09/08 14:10
2016/09/08 14:36
退会済みユーザー
2016/09/08 14:40
退会済みユーザー
2016/09/08 14:53
2016/09/08 14:58
2016/09/08 15:09
2016/09/08 15:21
退会済みユーザー
2016/09/09 13:48
2016/09/11 07:40
退会済みユーザー
2016/09/11 14:19
退会済みユーザー
2016/09/12 01:38
2016/09/12 02:18
退会済みユーザー
2016/09/12 11:06