ThreadLocal是指某线程的局部变量。用法如下:
package com.concurrent;
import junit.framework.TestCase;
public class TestThreadLocal extends TestCase {
public void testThreadLocal1() {
SharedResource sharedResource = new SharedResource();
for (int i = 0; i < 3; i++) {
TestThread t = new TestThread(sharedResource);
t.start();
}
}
public void testThreadLocal2() {
for (int i = 0; i < 3; i++) {
SharedResource sharedResource = new SharedResource();
TestThread t = new TestThread(sharedResource);
t.start();
}
}
public void testThreadLocal3() {
SharedResource sharedResource = new ThreadLocalSharedResource();
for (int i = 0; i < 3; i++) {
TestThread t = new TestThread(sharedResource);
t.start();
}
}
static class SharedResource {
private int count = 0;
public int getCount() {
return count++;
}
}
static class ThreadLocalSharedResource extends SharedResource {
private ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return 0;
}
};
@Override
public int getCount() {
int oldValue = threadLocal.get();
int newValue = oldValue + 1;
threadLocal.set(newValue);
return oldValue;
}
}
static class TestThread extends Thread {
private SharedResource sharedResource;
TestThread(SharedResource sharedResource) {
this.sharedResource = sharedResource;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread() + ", " + sharedResource.getCount());
}
}
}
}
运行testThreadLocal1,输出:
Thread[Thread-0,5,main], 0
Thread[Thread-0,5,main], 1
Thread[Thread-0,5,main], 2
Thread[Thread-1,5,main], 3
Thread[Thread-1,5,main], 4
Thread[Thread-1,5,main], 5
Thread[Thread-2,5,main], 6
Thread[Thread-2,5,main], 7
Thread[Thread-2,5,main], 8
一个共享资源,三个线程共享。
如果要的结果是每个线程只会输出0,1,2,那可以new三个共享资源,也就是testThreadLocal2,输出结果:
Thread[Thread-0,5,main], 0
Thread[Thread-0,5,main], 1
Thread[Thread-0,5,main], 2
Thread[Thread-2,5,main], 0
Thread[Thread-2,5,main], 1
Thread[Thread-2,5,main], 2
Thread[Thread-1,5,main], 0
Thread[Thread-1,5,main], 1
Thread[Thread-1,5,main], 2
但是,共享资源一般只有一个,那怎么保证上面的输出呢?那就要用到ThreadLocal了,运行testThreadLocal3:
Thread[Thread-0,5,main], 0
Thread[Thread-0,5,main], 1
Thread[Thread-0,5,main], 2
Thread[Thread-2,5,main], 0
Thread[Thread-2,5,main], 1
Thread[Thread-2,5,main], 2
Thread[Thread-1,5,main], 0
Thread[Thread-1,5,main], 1
Thread[Thread-1,5,main], 2
ThreadLocal保证每个线程里的共享资源都是独立的。