ThreadLocal,線程之間隔絕淫茵。
public class ThreadLocal2 {
//volatile static Person p = new Person();
static ThreadLocal<Person> tl = new ThreadLocal<>();
public static void main(String[] args) {
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(tl.get());
}).start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
tl.set(new Person());
}).start();
}
static class Person {
String name = "zhangsan";
}
}
輸出:
null
上面代碼茶宵,在一個(gè)線程中設(shè)置 tl.set(new Person())桐汤,在另一個(gè)線程中tl.get()的是null。
在ThreadLocal set方法里溢吻,
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
進(jìn)入getMap
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
-- set的時(shí)候维费,是把值設(shè)置到了當(dāng)前線程的map中,所以別的線程訪問(wèn)不到促王。
- ThreadLocal有用在聲明式事物中掩完,保證同一個(gè)Connection。