概述
ThreadLocal仅仆,即線程本地變量太颤,它為每一個使用該變量的線程提供獨立的變量副本贾惦,每一個線程都可以獨立地改變自己的變量副本叠荠,而不會影響其它線程匿沛。
構(gòu)造方法
- ThreadLocal()
成員變量
- 222
成員方法
- initialValue()
protected T initialValue() {
return null;
}
返回變量的初始值,默認返回為空榛鼎,可在子類中復寫該方法逃呼;
- get()
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
// 獲取線程的本地變量集合
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
返回當前線程對應的本地變量副本值;
- set(T value)
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
// 為線程創(chuàng)建本地變量集合
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
設置當前線程對應的本地變量副本值者娱;
- remove()
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}
移除當前線程對應的本地變量副本抡笼;
實例
public class Main {
private ThreadLocal<Integer> mThreadLocal = new ThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return 0;
}
};
private int getNext() {
mThreadLocal.set(mThreadLocal.get() + 1);
return mThreadLocal.get();
}
public static void main(String[] args) {
Main main = new Main();
Task task1 = new Task(main);
Task task2 = new Task(main);
Task task3 = new Task(main);
Task task4 = new Task(main);
task1.start();
task2.start();
task3.start();
task4.start();
}
static class Task extends Thread {
private Main main;
private Task(Main main) {
this.main = main;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName() + " -----> " + main.getNext());
}
}
}
}