ThreadLocalメモ

2705 ワード

jdkの説明を参照します.
/**
 * This class provides thread-local variables.  These variables differ from
 * their normal counterparts in that each thread that accesses one (via its
 * <tt>get</tt> or <tt>set</tt> method) has its own, independently initialized
 * copy of the variable.  <tt>ThreadLocal</tt> instances are typically private
 * static fields in classes that wish to associate state with a thread (e.g.,
 * a user ID or Transaction ID).
 **/

翻訳:このクラスはスレッド内のローカル変数を提供します.これらの変数は一般的なコピーとは異なり、各スレッドには独自のアクセスがあり、初期化された変数コピーに依存します.ThreadLocalインスタンスは、通常、スレッドのステータスと通信するためにprivate staticタイプとして宣言されます.
次の言葉はThreadLocalを理解するのに役立ちます.
ThreadLocalは主にオブジェクトを保持する方法とパラメータの伝達を避ける便利なオブジェクトアクセス方式を提供している.
マルチスレッド同時実行では、ThreadLocalはスレッドを分離してデータを格納することで、マルチスレッド変数アクセスの競合問題を解決します.
ロックメカニズムとThreadLocalスレッドの局所変数の本質的な違いは、変数を共有するかどうか(前者は、後者はNO)であり、この大前提の下で、ロックメカニズムは時間変換空間(同時の本質、すなわちシリアル化を防止する)であり、ThreadLocalは空間変換時間(変数の差別化、互いに干渉しないことも需要によるものである)【後半文はあまり意味がなく、主に理解を助け、誤区から離れる!】である.
まず簡単なdemoを見てみましょう.
package com.caiya.test._concurrent;

/**
 * Created by caiya on 16/4/5.
 */
public class TestNum {

    //  ThreadLocal , 
    private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>(){
        @Override
        protected Integer initialValue() {
            return 0;
        }
    };


    public int getNextNum(){
        seqNum.set(seqNum.get() + 1);
        return seqNum.get();
    }


    public static void main(String[] args) {
        TestNum test = new TestNum();
        //  , 
        ThreadClient t1 = new ThreadClient(test);
        ThreadClient t2 = new ThreadClient(test);
        ThreadClient t3 = new ThreadClient(test);
        t1.start();
        t2.start();
        t3.start();
    }

    //  
    private static class ThreadClient extends Thread{

        private TestNum test;

        public ThreadClient(TestNum test){
            this.test = test;
        }

        @Override
        public void run() {
            for (int i = 0; i<3; i++){
                System.out.println(Thread.currentThread().getName() + "thread[" + i + "]:" + " --> sn.nextNum:" + test.getNextNum());
            }
        }
    }




}

実行結果:
Thread-2thread[0]: --> sn.nextNum:1
Thread-2thread[1]: --> sn.nextNum:2
Thread-0thread[0]: --> sn.nextNum:1
Thread-2thread[2]: --> sn.nextNum:3
Thread-1thread[0]: --> sn.nextNum:1
Thread-1thread[1]: --> sn.nextNum:2
Thread-0thread[1]: --> sn.nextNum:2
Thread-0thread[2]: --> sn.nextNum:3
Thread-1thread[2]: --> sn.nextNum:3

各スレッドの内部変数が互いに干渉しないことがわかります.