最近在看公司项目的架构,在看到一个获取用户登录信息的类,很是迷惑,我先把这个类贴出来
public class ThreadLocalUtils {
private static ThreadLocal local = new ThreadLocal() { protected synchronized Object initialValue()
{
return new FastHashMap();
} };
public ThreadLocalUtils()
{
} public static Object put(Object key, Object value)
{
return getThreadLocalMap().put(key, value);
} public static Object get(Object key)
{
return getThreadLocalMap().get(key);
} public static Object remove(Object key)
{
return getThreadLocalMap().remove(key);
} public static Map getThreadLocalMap()
{
return (Map)local.get();
} public static boolean containsKey(Object key)
{
return getThreadLocalMap().containsKey(key);
} public static boolean containsValue(Object value)
{
return getThreadLocalMap().containsValue(value);
} public static void clear()
{
getThreadLocalMap().clear();
}
}这个类的作用是当一个用户登录去做某一项操作的时候,会控制逻辑类把用户信息通过ThreadLocalUtils.put("zheuser",user)
里面去,后面处理逻辑类就可以ThreadLocalUtils.get("zheuser")获得用户信息。我迷惑的是如果有多个用户同时登录做各种操作,get到的信息
会不会是最后一个用户的信息。因为put用的key值是一样的都是zheuser,而ThreadLocalUtils 中的FastHashMap()是一个static的。我写了一个双线程的测试类,这个类是这样的:
public class TwoThread extends Thread {
public void run() {
ThreadLocalUtils.put("key","New thread");
for ( int i = 0; i < 50; i++ ) {
System.out.println("New thread ="+ThreadLocalUtils.get("key"));
}
} public static void main(String[] args) {
ThreadLocalUtils.put("key","Main thread");
TwoThread tt = new TwoThread();
tt.start();
for ( int i = 0; i <50; i++ ) {
System.out.println("Main thread ="+ThreadLocalUtils.get("key"));
}
}
}
这个类包括主线程的话就有两个线程在运行
运行结果是这样的:
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
Main thread =Main thread
New thread =New thread
Main thread =Main thread
New thread =New thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
New thread =New thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
New thread =New thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread按我的想法是结果可能都会=Main thread,但实际上不是这样,谁能更清楚的解释一下,谢谢!
public class ThreadLocalUtils {
private static ThreadLocal local = new ThreadLocal() { protected synchronized Object initialValue()
{
return new FastHashMap();
} };
public ThreadLocalUtils()
{
} public static Object put(Object key, Object value)
{
return getThreadLocalMap().put(key, value);
} public static Object get(Object key)
{
return getThreadLocalMap().get(key);
} public static Object remove(Object key)
{
return getThreadLocalMap().remove(key);
} public static Map getThreadLocalMap()
{
return (Map)local.get();
} public static boolean containsKey(Object key)
{
return getThreadLocalMap().containsKey(key);
} public static boolean containsValue(Object value)
{
return getThreadLocalMap().containsValue(value);
} public static void clear()
{
getThreadLocalMap().clear();
}
}这个类的作用是当一个用户登录去做某一项操作的时候,会控制逻辑类把用户信息通过ThreadLocalUtils.put("zheuser",user)
里面去,后面处理逻辑类就可以ThreadLocalUtils.get("zheuser")获得用户信息。我迷惑的是如果有多个用户同时登录做各种操作,get到的信息
会不会是最后一个用户的信息。因为put用的key值是一样的都是zheuser,而ThreadLocalUtils 中的FastHashMap()是一个static的。我写了一个双线程的测试类,这个类是这样的:
public class TwoThread extends Thread {
public void run() {
ThreadLocalUtils.put("key","New thread");
for ( int i = 0; i < 50; i++ ) {
System.out.println("New thread ="+ThreadLocalUtils.get("key"));
}
} public static void main(String[] args) {
ThreadLocalUtils.put("key","Main thread");
TwoThread tt = new TwoThread();
tt.start();
for ( int i = 0; i <50; i++ ) {
System.out.println("Main thread ="+ThreadLocalUtils.get("key"));
}
}
}
这个类包括主线程的话就有两个线程在运行
运行结果是这样的:
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
Main thread =Main thread
New thread =New thread
Main thread =Main thread
New thread =New thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
New thread =New thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
New thread =New thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
Main thread =Main thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread
New thread =New thread按我的想法是结果可能都会=Main thread,但实际上不是这样,谁能更清楚的解释一下,谢谢!
thinking java有详细的解释