シミュレーションスレッドローカルクラスの実装:スレッド範囲内の共有変数、各スレッドは彼にのみアクセスでき、他のスレッドにアクセスできません。
パッケージcom.ljq.test.thread; ABモジュール * @Author Administrator * */Public Class SthreadScopesharedAta {//共有データを準備します= 0; <スレッド、integer>(); public static void main(string [] args){//(int i = 0; i <2; i ++){new runnabl d run(){ //現在のスレッドのデータを変更します.out.println()。 ;}} static class a {public void get(){int data = thread.currentthread()); public void get(){int data.get(thread.currentthread());
結果の実行:
Threadlocalの役割と目的:
スレッドでのデータ共有の場合、つまり同じプログラムコードの場合、同じスレッドで実行するときに複数のモジュールを共有する必要があり、別のスレッドで実行されるときに別のデータが共有されます。
各スレッドは、内部マップにレコードを追加するのと同等のグローバルスレッドローカルオブジェクトを呼び出します。スレッドの最後に、threadlocal.clear()メソッドを呼び出すことができ、メモリがより速くリリースされるようにすることができます。また、スレッドは関連するThreadlocal変数も自動的にリリースできるため、呼び出してもかまいません。
ThreadLocalのアプリケーションシナリオ:
注文処理には、一連の操作が含まれています。在庫を削減し、一般的な操作を変更する必要があります。それ以外の場合、すべての操作が送信されます。これにより、これらの操作は同じデータベース接続オブジェクトを使用する必要があり、これらの操作のコードは異なるモジュールクラスにあります。
銀行の転送には、一連の操作が含まれます。アカウントから転送されるバランスを削減し、これらの2つの操作のバランスを同じように、同じデータベース接続オブジェクト、および転送する必要があります。転送操作コードは、2つの異なるアカウントオブジェクトの方法です。
たとえば、STRUT2のActionContextは、同じコードが異なるスレッドで実行される場合、このコードによって動作するデータは、getContextメソッドで取得されるオブジェクトですスレッドは、GetContextメソッドを何回呼び出しても、モジュールが同じモジュールであるGetContextメソッドを呼び出します。
実験的なケース:グローバルで共有されたスレッドローカル変数を定義し、ランダム値をスレッドローカル変数に格納し、他のさまざまなカテゴリの他の複数のメソッドを呼び出します、複数のクラスが同じスレッドで同じデータを共有していることがわかります。
Threadlocal変数をカプセル化して、外側の世界がthreadlocal変数を直接動作させないようにします。
このアプリケーションは、基本的なタイプのデータのパッケージでは比較的まれです。
オブジェクトタイプデータのパッケージはより一般的です。つまり、特定のクラスで異なるスレッドの独立したインスタンスオブジェクトを作成させます。
com.ljq.test.thread取得したインスタンスオブジェクトは、現在カプセル化されたオブジェクトです。 <2; i ++){new runnable()(){@override public void run(){int data = new Random(); system.out.println(thread.currentthread()。 x x .set(mythreadscopedata()mydata( "name data); 「名前 +データ); get()。対応するメソッドstatic class a {public void get(){int data = x.get(); );* mythreadscopedata mydata = mythreadscopedata.get(); .getage()); mythreadscopedata = mythreadscopedata.getThreadInstance(); "、" + mydata.getage();}} //対応するメソッドstatic class b {public void get(){int data = x .get(); .currenthread() getMyData: " + myData.getName() +"、 " + mydata.getage()); rivate mythreadscopedata(){} //インスタンスメソッドを提供します。同期キーワードを追加して、スレッドが独自のデータを取得することを示すことはありません。そして、互いに干渉しないでください== null);現在のスレッド範囲のデータセット<mythReadScopeData>新しいThreadLocal <mythReadScopeEdata>() .name = name;} public int getage(){return age;} public void Setage(int age){this.age = age;}}}}