ThreadLocal线程副本,可以理解为一种线程变量,作用域为当前线程,数据存放在ThreadLocal可以一个线程内共享。好处是避免了层与层之间的参数传递,实现松耦合。
public class SessionContainer {
private static final ThreadLocal<SessionCache> sessionThreadLocal = new ThreadLocal<SessionCache>();
public static SessionCache getSession() {
return sessionThreadLocal.get();
}
public static void setSession(SessionCache sessionCache) {
sessionThreadLocal.set(sessionCache);
}
public static void clear() {
sessionThreadLocal.set(null);
}
}
public class Global {
public static final ThreadLocal transferThreadLocal = new ThreadLocal();
public static Map<String, Object> getTransfer() {
Map<String, Object> map = (Map<String, Object>) transferThreadLocal.get();
if (map == null) {
map = new HashMap<String, Object>();
transferThreadLocal.set(map);
}
return map;
}
public static void setTransfer(String key, Object value) {
Map<String, Object> map = getTransfer();
map.put(key, value);
transferThreadLocal.set(map);
}
}
public class Test{
public static void main(String[] args){
Map<String, Object> transferMap = Global.getTransfer();
transferMap.put("host", Global.getValue("weburl"));
transferMap.put("webname", Global.getValue("webname"));
Global.setTransfer("user", user);
}
}
首先,ThreadLocal 不是用来解决多线程资源访问的,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是访问不到的。各个线程中访问的是不同的对象。 以下测试返回结果:
t2 com.sunyard.util.ThreadLocal2$Person@152236d9
t1 null
public class ThreadLocal2 {
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(Thread.currentThread().getName()+" "+tl.get());
},"t1").start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
tl.set(new Person());
System.out.println(Thread.currentThread().getName()+" "+tl.get());
},"t2").start();
}
static class Person {
String name = "zhangsan";
}
}