ThreadLocal学習資料

7553 ワード

次のコードを実行すると、スレッドセキュリティの問題が発生します.
2つのスレッドを起動し、nameプロパティ値を変更します.
package com.liwei.thread;



/**

 *  

 * 

 * @author Administrator

 * 

 */

public class ThreadLocalTest implements Runnable {

    private int i = 0;

    private String name = null;



    @Override

    public void run() {

        for (; i < 10; i++) {

            name = Thread.currentThread().getName();

            try {

                Thread.sleep(10);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            System.out.println(Thread.currentThread().getName() + ":" + name);

        }

    }



    public static void main(String[] args) {

        ThreadLocalTest tlt = new ThreadLocalTest();

        Thread t1 = new Thread(tlt, "AAA");

        Thread t2 = new Thread(tlt, "BBB");

        t1.start();

        t2.start();

    }

}

この問題を解決するために、コードに同期モニタを追加します.以下のようにします.
package com.liwei.thread;



/**

 *  

 * 

 * @author Administrator

 * 

 */

public class ThreadLocalTest implements Runnable {

    private int i = 0;

    private String name = null;



    @Override

    public void run() {

        for (; i < 10000; i++) {

            synchronized (this) {

                name = Thread.currentThread().getName();

                try {

                    Thread.sleep(10);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

                System.out.println(Thread.currentThread().getName() + ":" + name);

            }

        }

    }



    public static void main(String[] args) {

        ThreadLocalTest tlt = new ThreadLocalTest();

        Thread t1 = new Thread(tlt, "AAA");

        Thread t2 = new Thread(tlt, "BBB");

        t1.start();

        t2.start();

    }

}

次に、私たちの主役が登場します.ThreadLocalの威力を見てみましょう.
package com.liwei.thread;



/**

 *  

 * 

 * @author Administrator

 * 

 */

public class ThreadLocalTest2 implements Runnable {



    private int i = 0;

    private ThreadLocal<String> threadLocal = new ThreadLocal<>();



    @Override

    public void run() {

        for (; i < 100; i++) {

            threadLocal.set(Thread.currentThread().getName());



            try {

                Thread.sleep(10);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            System.out.println(Thread.currentThread().getName() + ":" + threadLocal.get());



        }

    }



    public static void main(String[] args) {

        ThreadLocalTest2 tlt = new ThreadLocalTest2();

        Thread t1 = new Thread(tlt, "CCC");

        Thread t2 = new Thread(tlt, "DDD");

        t1.start();

        t2.start();

    }

}

ソースコードを見ると、ThreadLocalMapは現在のThreadLocalをキーとしていることがわかります.
 
参考資料:
ThreadLocal-分析-まとめ-洞玄-ITeyeテクノロジーWebサイトhttp://mxdba.iteye.com/blog/777716
深入浅出ThreadLocal-Java総合-Java-ITeyeフォーラムhttp://www.iteye.com/topic/757478