シングルトンパターンとスレッドの安全性の問題

シングルトンは何1
        シングルトンパターンは、クラスのインスタンスを1つだけ確実にするために、システム全体のアクセスポイントのグローバルモデルのための方法を提供することです。
        単一ケースの特性:
                いずれの場合にも、常に唯一のシングルトンクラスのインスタンスが存在している
                単一の実施形態は、この例では、システム全体を提供する能力を必要とするが一意である 

実施例2のシングルモード単一の実施形態怠惰な
        実装コード:
        パブリッククラスMySingleton {
                
                プライベート静的インスタンス= nullをMySingleton;
                
                プライベートMySingleton(){}
                
                パブリック静的MySingletonのgetInstance(){
                        試み{ 
                                IF(インスタンス= nullを!){//怠惰な男 
                                        
                                }他{
                                        //インスタンスを作成する前に、いくつかの時間のかかる準備作業かもしれ 
                                        Thread.sleep(300)。
                                        = MySingleton新しい新しいインスタンス();
                                }
                        }キャッチ(InterruptedExceptionあるE){ 
                                e.printStackTrace();
                        }
                        戻りインスタンス;
                }
        }
いくつかの準備作業は、時間がかかるインスタンスを作成する前に処理される、マルチスレッドの呼び出しであると仮定する:

        パブリッククラスMyThreadスレッド{延び
                  
                @Override
                公共ボイドRUN(){ 
                        System.out.printlnは(MySingleton.getInstance()ハッシュコード());
                }
                
                公共の静的な無効メイン(文字列[] args){ 
                        
                        MyThread [] =新しい新しいMTS MyThread [10];
                        {(; I <mts.length I ++ INT I = 0)するための
                                MTS [I](MyThread新しい新規=);
                        }
                        
                        (INT J = 0; J <mts.length ; J ++){
                                MTS [J] .start();
                        }
                }
        }
実行結果として次れる:

1210420568
1210420568
1935123450
1718900954
1481297610
1863264879
369 539 795
1210420568
1210420568
602 269 801

シングルスレッド安全性の結果から分かるように、我々ができ、保証の実施形態ではなかったです次の解決策を作る

怠惰なスレッドの安全性の問題の3つの実施形態
の同期コードブロックの実装を
        {クラスMySingletonパブリック
                
                プライベート静的インスタンスMySingleton = NULL;
                
                プライベートMySingleton(){}
                
                //パブリック静的MySingletonのgetInstance(同期){
                パブリック静的MySingletonのgetInstance(){
                        試み{ 
                                同期(MySingleton.class){
                                        (= nullの場合!)IF {遅延//式 
                                                
                                        他は} {
                                                //加工がインスタンス作成する前に、いくつかの準備作業があってもよい 
                                                のThread.sleep(300);
                                                インスタンスMySingleton新しい新=();
                                        }
                                }
                        }キャッチ(InterruptedExceptionある電子){ 
                                e.printStackTrace();
                        }
                        インスタンスを返します。
                }
        }

 

公開された157元の記事 ウォン称賛43 ビュー90000 +

おすすめ

転載: blog.csdn.net/qq_39581763/article/details/104197683