カリキュラムデザインパターンデザインパターン簡潔8-10シングルトンシングルトンデザインパターン-ThreadLocalスレッド

1コース説明します

1.1アプリケーションのシナリオ

2コードのチュートリアル

2.1 THREADLOCALアプリケーション

 

 

1コース説明します
1.1アプリケーションのシナリオ

マルチスレッド時:

、宇宙用の同期ロック時間を使って(長いスレッドキュー時間)

時間的なアプローチのために使用ThreadLocalの使用スペース。

各スレッドのオブジェクトを提供するシングルトンのThreadLocalに基づいて、マルチスレッドアクセスは、互いに影響を及ぼさないであろう。

ThreadLocalの直接増加並行性を得る単一の実施形態に基づいて、このアプリケーション・シナリオデータベース接続プール、および糸の分離を実施し、スレッドがグローバル・データベース切断をもたらさない直接、フォールトトレランスを向上させるために適用される得られた、断線を引き起こし。しかし、コードレベルが異なるスレッドが生成され、単一のケースミックスを避けるために。

 

彼らの理解:実際には、本実施の形態では、単一引用符(THREADLOCAL)モードが同じクラスので、単一の実施形態に単一の実施形態を言及しなかった、オブジェクトが取り出された同じではありません

 

2コードのチュートリアル
2.1 THREADLOCALアプリケーション

テストカテゴリ:

パッケージcom.geely.design.pattern.creational.singleton。

輸入 java.io. * ;
輸入java.lang.reflect.Constructor。
インポートにjava.lang.reflect.InvocationTargetException; 

パブリック クラスのテスト{ 

    公共 静的 ボイドメイン(文字列[]引数){ 
        スレッドスレッド1 = 新しいスレッド(新しいT())。
        スレッドスレッド2 = 新しいスレッド(新しいT()); 
        thread1.start(); 
        thread2.start(); 
        System.out.println( "结束了の!!!" ); 
    } 

}

 

Threadクラス:

パッケージcom.geely.design.pattern.creational.singleton。

/ ** 
 *注:该类为线程类、调用LazySingleton 
 * / 
パブリック クラス Tは、実装のRunnable { 

    @Override
     公共 ボイドラン(){
 / *         StaticInnerClassSingleton staticInnerClassSingleton = StaticInnerClassSingleton.getInstance()。* / 
        ThreadLocalInstance threadLocalInstance = ThreadLocalInstance.getInstance()。
        System.out.println(にThread.currentThread()のgetName() + "===" + threadLocalInstance)。
    } 
}

 

エンティティクラス:

パッケージcom.geely.design.pattern.creational.singleton。

パブリック クラスThreadLocalInstance {
     / ** 
     *预防外部类实例化本类
     * / 
    プライベート  ThreadLocalInstance(){ 

    } 

   パブリック 静的 最終のThreadLocal <ThreadLocalInstance> threadLocalInstance
            = 新規のThreadLocal <ThreadLocalInstance> (){
        / ** 
        *重写初始化方法
        * / 
       @Overrideは
       保護ThreadLocalInstanceはinitialValue(){
            戻り 新しい)(ThreadLocalInstanceします。
        } 
   }。

    / **
     *获得实例
     * @return 
     * / 
    パブリック 静的ThreadLocalInstanceのgetInstance(){
        戻りthreadLocalInstance.getを(); 
    } 
}

 

クラスへの参照:

  / ** 
     *この現在のスレッドのコピーに値を返します
     *スレッドローカル変数。変数は、に値がない場合
     *現在のスレッドが、それが最初に返された値に初期化される
     {の呼び出しによって* @link #initialValue}方法。
     * 
     * @return このスレッドローカルの現在のスレッドの値
      * / 
    パブリックTのGET(){ 
        スレッドT = にThread.currentThread()。
        ThreadLocalMap地図 = GetMapリクエスト(T)。
        もし(マップ!= nullの){ 
            ThreadLocalMap.Entry電子 = map.getEntry(この);
            もし(!E = nullのリターン(T)e.value。
        } 
        を返す)(setInitialValueします。
    } 

静的 クラスThreadLocalMap { / ** *このハッシュマップのエントリが使用して、弱い参照を拡張 *(常にキーとしてその主REFフィールド * ThreadLocalのオブジェクト)。そのnullキー(すなわちentry.get()に注意してください * == null)をキーは、もはや参照され、そのことを意味しません *エントリがテーブルから抹消することができます。そのようなエントリが参照される 以下のコードで「古いエントリ」として、*。 * / 静的 クラスエントリ延び弱い参照<ThreadLocalの> { / ** このThreadLocalの関連付けられた値。* / Object値。 エントリ(ThreadLocalのK、オブジェクトV){ スーパー(K)。 = V; } } }

 

 

印刷ログ:

 

終わり!
スレッド -0 === com.geely.design.pattern.creational.singleton.ThreadLocalInstance@120f0be 
スレッド -1 === com.geely.design.pattern.creational.singleton.ThreadLocalInstance@75dfb148の

コードで処理が終了し、終了 0

 

おすすめ

転載: www.cnblogs.com/1446358788-qq/p/11442693.html