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