Java中ThreadLocal分析
ThreadLocal并不是一個Thread,而是一個線程的局部變量,當使用ThreadLocal維護變量時,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,所以每個線程都可以獨立的改變自己的副本,而不會影響其他線程所對應的副本。
ThreadLocal類的接口很簡單,主要包含以下四個方法,如下:
(1)public void set(T value);
設置當前線程的局部變量值。
2)public T get();
獲得當前線程的局部變量值。
3)public void remove();
刪除當前線程的局部變量值,目的是減少內存的占用。
4)protected T initValue();
返回該線程的局部變量初始值。
ThreadLocal是如何實現為每個線程提供一個獨立的副本值的呢?其實實現過程很簡單,以下是我自己實現的一個簡單版本: package com.test;
import java.util.Collections;
import java.util.HashMap;
public class SimpleThreadLocal<T> {
private HashMap map=(HashMap) Collections.synchronizedMap(new HashMap());
public void set(T value){
Thread thread =Thread.currentThread();
map.put(thread, value);
}
public T get(){
Thread thread =Thread.currentThread();
Object o=map.get(thread);
if(o==null&&map.containsKey(thread)){
map.put(thread, initValue());
}
return (T) o;
}
public void remove(){
map.remove(Thread.currentThread());
}
protected T initValue(){
return null;
}
}
ThreadLocal與同步機制的比較
ThreadLocal和線程同步都是為了解決多線程中相同變量的訪問沖突問題
在同步機制中,通過對象的鎖機制保證同一時間只有一個線程訪問變量。這是該變量是多個線程共享的,使用同步機制要求程序分析什么時候對變量進行讀寫,什么時候需要鎖定對象,什么時候釋放對象鎖,這樣增加了程序設計的難度。
而ThreadLocal則從另外一個角度解決多線程的問題。ThreadLocal會為每個線程提供一個獨立的變量副本,這樣就隔離了多線程對數據產生的干擾。
概括起來說,同步機制是以時間換取空間的方式,而ThreadLocal是以空間換取時間的方式。