ThreadLocal対象の使い方

4862 ワード

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