1.Threadlocal爲每個線程都創建了一個局部變量副本,線程和線程之間的局部變量相互隔離,
該類提供了線程局部 (thread-local) 變量。這些變量不同於它們的普通對應物,因爲訪問某個變量(通過其 get 或 set 方法)的每個線程都有自己的局部變量,它獨立於變量的初始化副本。ThreadLocal 實例通常是類中的 private static 字段,它們希望將狀態與某一個線程(例如,用戶 ID 或事務 ID)相關聯。
ThreadLocal在保持事務的特性上有獨特的優勢,例如多個線程鏈接數據庫去操作數據庫鏈接的開啓和關閉,線程之間的開啓和關閉有可能會相互干擾,此時可以
將conn放入ThreadLocal<Connection> threadlocal中,從而實現線程之間局部變量的有效隔離;
2.示例1:
public class UniqueThreadIdGenerator { private static final AtomicInteger uniqueId = new AtomicInteger(0); private static final ThreadLocal < Integer > uniqueNum = new ThreadLocal < Integer > () { @Override protected Integer initialValue() { return uniqueId.getAndIncrement(); } }; public static int getCurrentThreadId() { return uniqueId.get(); } } // UniqueThreadIdGenerator
3.示例2:
public class SequenceImpl implements Sequence{ private static int number=0; @Override public int getNumber() { numberContainer.set(numberContainer.get()+1); return numberContainer.get(); } private static ThreadLocal<Integer> numberContainer=new ThreadLocal<Integer>(){ @Override protected Integer initialValue() { return 0; } }; public static void main(String[] args) { Sequence sequencea = new SequenceImpl(); ClientThread thread1 = new ClientThread(sequencea); ClientThread thread2 = new ClientThread(sequencea); ClientThread thread3 = new ClientThread(sequencea); thread1.start(); thread2.start(); thread3.start(); } }
4.方法摘要
方法摘要 | |
---|---|
T |
get() 返回此線程局部變量的當前線程副本中的值。 |
protected T |
initialValue() 返回此線程局部變量的當前線程的“初始值”。 |
void |
remove() 移除此線程局部變量當前線程的值。 |
void |
set(T value) 將此線程局部變量的當前線程副本中的值設置爲指定值。 |