ThreadLocal在java web工程中的使用。

longerandlonger發表於2013-03-20

    以下內容是我自己的認識,可能有錯。

    ThreadLocal是用來存取執行緒共享變數的。而一個http請求,在java web裡面,都是在一個執行緒裡處理的(除非你自己手動建立新執行緒。ps:在AO、Manager、DAO裡面,還是原來的執行緒嗎?我該自己去測一下)。

    可以用在一個實用類裡面放一個靜態ThreadLocal<T>,例如:

class Context {
	private static ThreadLocal<Integer> holder = new ThreadLocal<Integer>();
		
	public static Integer get() {
		return holder.get();
	}
	
	public static void set(Integer value) {
		holder.set(value);
	}
}

    在處理一個http請求時:你在servlet、filter裡呼叫set,把需要儲存的物件放進去。之後在呼叫get取出。另一個http請求的執行緒不會取到這個執行緒的物件。

    ps:

    每一個執行緒有一個ThreadLocalMap物件,它的key是一個ThreadLocal物件,它的值就是使用者存進來的值。

    當你呼叫Context.set(value1),就是以holder為key,以value1為值,存到當前執行緒ThreadLocalMap物件裡。

    當你呼叫Context.get(),就是:以holder為key,從當前執行緒ThreadLocalMap物件中取出value1。

    這意味著,多個執行緒的ThreadLocalMap物件裡面都有holer這個key,但value卻是不同的。

相關文章