ホームページ  >  記事  >  Java  >  Javaスレッドローカル

Javaスレッドローカル

WBOY
WBOYオリジナル
2024-08-30 16:03:25541ブラウズ

同じスレッドで読み書きできる変数は、Java の ThreadLocal クラスと呼ばれるクラスを使用して作成できるため、同じコードが 2 つのスレッドで実行され、そのコードが同じスレッドの変数を参照している場合、 ThreadLocal の場合、2 つのスレッドは ThreadLocal のこれらの変数を認識できないため、ThreadLocal クラスを使用するとコードをスレッド セーフにすることができますが、ThreadLocal クラスと ThreadLocal クラスのインスタンスを使用しないとコードはスレッド セーフになりません。 new 演算子を使用して Java で他のクラスのインスタンスを作成するのと同じように作成できます。

無料ソフトウェア開発コースを始めましょう

Web 開発、プログラミング言語、ソフトウェア テスト、その他

Java では ThreadLocal クラスはどのように機能しますか?

スレッドローカル変数は、Java の java.lang.ThreadLocal クラスによって提供されます。これらの変数は通常の変数とは異なり、独立して所有し、初期化された変数のコピーを持つ各スレッドから get または set メソッドを使用してアクセスできます。これは基本的に、不変クラスの作成とは別にスレッドの安全性を実現する他の方法の 1 つです。

オブジェクトの共有がなくなるため、アプリケーションのパフォーマンスとスケーラビリティが向上する同期の必要がなくなりました。 Java の ThreadLocal クラスは、クラス オブジェクトを拡張します。スレッドの制限であるローカル変数の拡張は、Java の ThreadLocal クラスによって提供されます。 ThreadLocal を表示できるのは 1 つのスレッドだけです。互いのスレッドは 2 つのスレッドの ThreadLocal 変数を参照できません。 ThreadLocal 変数はクラス内で静的なプライベート フィールドに属し、状態はスレッド内で維持されます。

Java での ThreadLocal の作成

ThreadLocal のインスタンスは、他の Java オブジェクトのインスタンスが new 演算子を使用して作成される方法と同じように作成されます。 Java で ThreadLocal を作成するには、以下の構文を検討してください:

private ThreadLocal variable_name = new ThreadLocal();

ThreadLocal の作成は、1 つのスレッドに対して 1 回だけ行う必要があります。値は、この ThreadLocal 内の複数のスレッドによって設定および取得でき、スレッドによって設定された値のみがそれ自体で表示されます。

Java で ThreadLocal 値を取得する

ThreadLocal に格納されている値は、get() メソッドを使用して読み取ることができます。 Java で ThreadLocal 値を取得するには、以下の構文を検討してください:

String variable_name = (String) threadLocal.get();

Java で ThreadLocal 値を設定します

作成後に ThreadLocal に格納される値は、set() メソッドを使用して設定できます。 Java で ThreadLocal 値を設定するには、以下の構文を検討してください:

threadLocal.set("value_that_needs_to_be_set");

Java の ThreadLocal 値を削除します。

作成後に ThreadLocal に設定された値は削除できます。 ThreadLocal 値は、ThreadLocal Remove() メソッドを使用して削除できます。 Java で設定されている ThreadLocal 値を削除するには、以下の構文を検討してください:

threadLocal.remove();

Java ThreadLocal の実装例

以下に挙げる例を示します:

例 #1

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());
}
}

出力:

Javaスレッドローカル

説明: 上記のプログラムでは、demo というクラスが定義されています。次に main メソッドを定義します。次に、ThreadLocal のインスタンスが数値に対して作成されます。次に、文字列に対して ThreadLocal のインスタンスが作成されます。次に、set() メソッドを使用して最初の数値が設定されます。次に、数値を返す現在のスレッドの値が get() メソッドを使用して取得されます。次に、set() メソッドを使用して 2 番目の数値を設定します。次に、数値を返す現在のスレッドの値が get() メソッドを使用して取得されます。次に、set() メソッドを使用して最初の文字列値が設定されます。次に、文字列を返す現在のスレッドの値が get() メソッドを使用して取得されます。次に、2 番目の文字列値が set() メソッドを使用して設定されます。次に、文字列を返す現在のスレッドの値が get() メソッドを使用して取得されます。プログラムの出力は上のスナップショットに示されています。

例 #2

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());
}
}

出力:

Javaスレッドローカル

説明: 上記のプログラムでは、demo というクラスが定義されています。次に main メソッドを定義します。次に、ThreadLocal のインスタンスが数値に対して作成されます。次に、文字列に対して ThreadLocal のインスタンスが作成されます。次に、set() メソッドを使用して最初の数値が設定されます。次に、数値を返す現在のスレッドの値が get() メソッドを使用して取得されます。次に、set() メソッドを使用して 2 番目の数値を設定します。次に、数値を返す現在のスレッドの値が get() メソッドを使用して取得されます。次に、set() メソッドを使用して最初の文字列値が設定されます。

次に、remove() メソッドを使用して、set() メソッドを使用して設定された最初の文字列値を削除します。次に、get() メソッドを使用して現在のスレッドの値が取得されますが、remove() メソッドを使用して設定された値を削除したため、null が返されます。次に、remove() メソッドを使用して、set() メソッドを使用して設定された最初の数値と 2 番目の数値を削除します。次に、get() メソッドを使用して現在のスレッドの値が取得されますが、remove() メソッドを使用して設定された値を削除したため、null が返されます。プログラムの出力は上のスナップショットに示されています。

Java の ThreadLocal クラスの利点

  • ThreadLocal クラスを使用すると、オブジェクトの状態がスレッド間で共有されないため、マルチスレッドのタスクが容易になります。
  • オブジェクトの状態はスレッド間で共有されないため、同期の必要はありません。
  • ThreadLocal は、オブジェクトが複数のスレッドに公開されることを回避します。

結論

このチュートリアルでは、ThreadLocal クラスの定義、動作、プログラミング例とその出力を通じてメソッドを理解することで、ThreadLocal クラスの概念を理解します。

以上がJavaスレッドローカルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。