ThreadLocal対象の使い方
4862 ワード
JavaのThreadLocal類は、同じスレッドでしか読み書きできない変数を作成することができます。したがって、このコードの一部にThreadLocal変数の参照が含まれている場合、2つのスレッドが同時にこのコードを実行しても、相手のThreadLocal変数にアクセスできません。
以下のコードは、どのようにThreadLocal変数を作成するかを示しています。
どのようにThreadLocal変数にアクセスしますか?
ThreadLocal変数を作成すると、次のコードで保存する必要がある値を設定できます。
ThreadLocalには汎型を指定し、毎回強制型に変換する必要はない。
私たちは汎型タイプを指定するThreadLocalオブジェクトを作成することができます。このようにすると、get()法を使って戻ってくる値を強制的なタイプに変換する必要がなくなります。一般タイプを指定するThreadLocalの例を以下に示す。
そして、我々は、ThreadLocalから値を取得する時も、強制的なタイプ変換は必要ありません。
以下は完全に実行可能なThreadLocalの例である。
以下のコードは、どのようにThreadLocal変数を作成するかを示しています。
1
private
ThreadLocal myThreadLocal =
new
ThreadLocal();
このコードを通じて、ThreadLocalオブジェクトを実例化したものが見られます。私たちはオブジェクトを一度にするだけで、どのスレッドが実装されているかを知る必要がありません。すべてのスレッドはこのThreadLocalのインスタンスにアクセスできますが、各スレッドは自分がThreadLocalを呼び出すset()メソッドで設定した値にしかアクセスできません。同じThreadLocalオブジェクトに異なる値を設定しても、同じスレッドでも相手の値にアクセスできません。どのようにThreadLocal変数にアクセスしますか?
ThreadLocal変数を作成すると、次のコードで保存する必要がある値を設定できます。
1
myThreadLocal.set("A thread local value”);
ThreadLocal変数に格納されている値を以下の方法で読み出すことができます。1
String threadLocalValue = (String) myThreadLocal.get();
get()メソッドはObjectオブジェクトに戻り、set()オブジェクトはObjectタイプのパラメータを入力する必要があります。ThreadLocalには汎型を指定し、毎回強制型に変換する必要はない。
私たちは汎型タイプを指定するThreadLocalオブジェクトを作成することができます。このようにすると、get()法を使って戻ってくる値を強制的なタイプに変換する必要がなくなります。一般タイプを指定するThreadLocalの例を以下に示す。
1
private
ThreadLocal myThreadLocal =
new
ThreadLocal<String>();
今はスリリングタイプの値をThreadLocalの対象に預けます。そして、我々は、ThreadLocalから値を取得する時も、強制的なタイプ変換は必要ありません。
以下は完全に実行可能なThreadLocalの例である。
01
public
class
ThreadLocalExample {
02
03
public
static
class
MyRunnable
implements
Runnable {
04
05
private
ThreadLocal threadLocal =
new
ThreadLocal();
06
07
@Override
08
public
void
run() {
09
threadLocal.set((
int
・) (Math.random() * 100D));
10
try
{
11
Thread.sleep(
2000
・);
12
}
catch
(InterruptedException e) {
13
14
}
15
System.out.println(threadLocal.get());
16
}
17
}
18
19
public
static
void
main(String[] args) {
20
MyRunnable sharedRunnableInstance =
new
MyRunnable();
21
Thread thread1 =
new
Thread(sharedRunnableInstance);
22
Thread thread2 =
new
Thread(sharedRunnableInstance);
23
thread1.start();
24
thread2.start();
25
}
26
27
}
上記の例は、MyRunnableの例を作成し、この例をパラメータとして2つのスレッドに渡す。二つのスレッドはそれぞれrun()法を実行し、いずれもThreadLocalの例で異なる値を保存している。それらが訪問したのがThreadLocalオブジェクトではなく、呼び出したset()メソッドが同期された場合、第二のスレッドは第一のスレッド設定の値を上書きします。しかし、それらが訪問したのはThreadLocalオブジェクトであるため、この二つのスレッドはいずれも相手の保存した値を見ることができない。つまり、それらがアクセスするのは2つの異なる値です。