ThreadLocal学習資料
7553 ワード
次のコードを実行すると、スレッドセキュリティの問題が発生します.
2つのスレッドを起動し、nameプロパティ値を変更します.
この問題を解決するために、コードに同期モニタを追加します.以下のようにします.
次に、私たちの主役が登場します.ThreadLocalの威力を見てみましょう.
ソースコードを見ると、ThreadLocalMapは現在のThreadLocalをキーとしていることがわかります.
参考資料:
ThreadLocal-分析-まとめ-洞玄-ITeyeテクノロジーWebサイトhttp://mxdba.iteye.com/blog/777716
深入浅出ThreadLocal-Java総合-Java-ITeyeフォーラムhttp://www.iteye.com/topic/757478
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