同じスレッドで読み書きできる変数は、Java の ThreadLocal クラスと呼ばれるクラスを使用して作成できるため、同じコードが 2 つのスレッドで実行され、そのコードが同じスレッドの変数を参照している場合、 ThreadLocal の場合、2 つのスレッドは ThreadLocal のこれらの変数を認識できないため、ThreadLocal クラスを使用するとコードをスレッド セーフにすることができますが、ThreadLocal クラスと ThreadLocal クラスのインスタンスを使用しないとコードはスレッド セーフになりません。 new 演算子を使用して Java で他のクラスのインスタンスを作成するのと同じように作成できます。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
スレッドローカル変数は、Java の java.lang.ThreadLocal クラスによって提供されます。これらの変数は通常の変数とは異なり、独立して所有し、初期化された変数のコピーを持つ各スレッドから get または set メソッドを使用してアクセスできます。これは基本的に、不変クラスの作成とは別にスレッドの安全性を実現する他の方法の 1 つです。
オブジェクトの共有がなくなるため、アプリケーションのパフォーマンスとスケーラビリティが向上する同期の必要がなくなりました。 Java の ThreadLocal クラスは、クラス オブジェクトを拡張します。スレッドの制限であるローカル変数の拡張は、Java の ThreadLocal クラスによって提供されます。 ThreadLocal を表示できるのは 1 つのスレッドだけです。互いのスレッドは 2 つのスレッドの ThreadLocal 変数を参照できません。 ThreadLocal 変数はクラス内で静的なプライベート フィールドに属し、状態はスレッド内で維持されます。
ThreadLocal のインスタンスは、他の Java オブジェクトのインスタンスが new 演算子を使用して作成される方法と同じように作成されます。 Java で ThreadLocal を作成するには、以下の構文を検討してください:
private ThreadLocal variable_name = new ThreadLocal();
ThreadLocal の作成は、1 つのスレッドに対して 1 回だけ行う必要があります。値は、この ThreadLocal 内の複数のスレッドによって設定および取得でき、スレッドによって設定された値のみがそれ自体で表示されます。
ThreadLocal に格納されている値は、get() メソッドを使用して読み取ることができます。 Java で ThreadLocal 値を取得するには、以下の構文を検討してください:
String variable_name = (String) threadLocal.get();
作成後に ThreadLocal に格納される値は、set() メソッドを使用して設定できます。 Java で ThreadLocal 値を設定するには、以下の構文を検討してください:
threadLocal.set("value_that_needs_to_be_set");
作成後に ThreadLocal に設定された値は削除できます。 ThreadLocal 値は、ThreadLocal Remove() メソッドを使用して削除できます。 Java で設定されている ThreadLocal 値を削除するには、以下の構文を検討してください:
threadLocal.remove();
以下に挙げる例を示します:
ThreadLocal クラスの get() メソッドと set() メソッドをデモするプログラム:
コード:
//a class called demo is defined public class Demo { //main method is called public static void main(String[] args) { //an instance of the ThreadLocal is created for a number ThreadLocal<Number> local = new ThreadLocal<Number>(); //an instance of the ThreadLocal is created for a string ThreadLocal<String> val = new ThreadLocal<String>(); //setting the first number value using set() method local.set(100); //obtaining the current thread's value which returns a number using get() method System.out.println("The number value that was set is = " + local.get()); //setting the second number value using set() method local.set(90); //obtaining the current thread's value which returns a numberusing get() method System.out.println("The number value that was set is = " + local.get()); //setting the first string value using set() method val.set("Welcome to ThreadLocal"); //obtaining the current thread's value which returns a stringusing get() method System.out.println("The string value that was set is = " + val.get()); //setting the second string value using set() method val.set("Learning is fun"); //obtaining the current thread's value which returns a stringusing get() method System.out.println("The string value that was set is = " + val.get()); } }
出力:
説明: 上記のプログラムでは、demo というクラスが定義されています。次に main メソッドを定義します。次に、ThreadLocal のインスタンスが数値に対して作成されます。次に、文字列に対して ThreadLocal のインスタンスが作成されます。次に、set() メソッドを使用して最初の数値が設定されます。次に、数値を返す現在のスレッドの値が get() メソッドを使用して取得されます。次に、set() メソッドを使用して 2 番目の数値を設定します。次に、数値を返す現在のスレッドの値が get() メソッドを使用して取得されます。次に、set() メソッドを使用して最初の文字列値が設定されます。次に、文字列を返す現在のスレッドの値が get() メソッドを使用して取得されます。次に、2 番目の文字列値が set() メソッドを使用して設定されます。次に、文字列を返す現在のスレッドの値が get() メソッドを使用して取得されます。プログラムの出力は上のスナップショットに示されています。
ThreadLocal クラスの Remove() メソッドをデモする Java プログラム:
コード:
//a class called demo is defined public class Demo { //main method is called public static void main(String[] args) { //an instance of the ThreadLocal is created for a number ThreadLocal<Number> local = new ThreadLocal<Number>(); //an instance of the ThreadLocal is created for a string ThreadLocal<String> val = new ThreadLocal<String>(); //setting the first number value using set() method local.set(100); //obtaining the current thread's value which returns a number using get() method System.out.println("The first number value that was set is = " + local.get()); //setting the second number value using set() method local.set(90); //obtaining the current thread's value which returns a number using get() method System.out.println("The second number value that was set is = " + local.get()); //setting the first string value using set() method val.set("Welcome to ThreadLocal"); //obtaining the current thread's value which returns a string using get() method System.out.println("The first string value that was set is = " + val.get()); //Using remove() method to remove the first string value that was set using set() method val.remove(); //obtaining the current thread's value which returns a string using get() method System.out.println("The first string value after using remove() method is = " + val.get()); //Using remove() method to remove the first number value and second number value that was set using set() method local.remove(); //obtaining the current thread's value using get() method System.out.println("The first number value and second number value after using remove() method is = " + local.get()); } }
出力:
説明: 上記のプログラムでは、demo というクラスが定義されています。次に main メソッドを定義します。次に、ThreadLocal のインスタンスが数値に対して作成されます。次に、文字列に対して ThreadLocal のインスタンスが作成されます。次に、set() メソッドを使用して最初の数値が設定されます。次に、数値を返す現在のスレッドの値が get() メソッドを使用して取得されます。次に、set() メソッドを使用して 2 番目の数値を設定します。次に、数値を返す現在のスレッドの値が get() メソッドを使用して取得されます。次に、set() メソッドを使用して最初の文字列値が設定されます。
次に、remove() メソッドを使用して、set() メソッドを使用して設定された最初の文字列値を削除します。次に、get() メソッドを使用して現在のスレッドの値が取得されますが、remove() メソッドを使用して設定された値を削除したため、null が返されます。次に、remove() メソッドを使用して、set() メソッドを使用して設定された最初の数値と 2 番目の数値を削除します。次に、get() メソッドを使用して現在のスレッドの値が取得されますが、remove() メソッドを使用して設定された値を削除したため、null が返されます。プログラムの出力は上のスナップショットに示されています。
このチュートリアルでは、ThreadLocal クラスの定義、動作、プログラミング例とその出力を通じてメソッドを理解することで、ThreadLocal クラスの概念を理解します。
以上がJavaスレッドローカルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。