最近在看公司项目的架构,在看到一个获取用户登录信息的类,很是迷惑,我先把这个类贴出来
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,但实际上不是这样,谁能更清楚的解释一下,谢谢!