ThreadLocal提供了線程內存儲變量的能力,這些變量不同之處在於每一個線程讀取的變量是對應的互相獨立的。通過get和set方法就可以得到當前線程對應的值。
ThreadLocal和Synchronized都是為了解決多線程中相同變量的訪問沖突問題,
不同的點是Synchronized是通過線程等待,犧牲時間來解決訪問沖突
ThreadLocal是通過每個線程單獨一份存儲空間,犧牲空間來解決沖突,
相比於Synchronized,ThreadLocal具有線程隔離的效果,只有在線程內才能獲取到對應的值,線程外則不能訪問到想要的值。
正因為ThreadLocal的線程隔離特性,使他的應用場景相對來說更為特殊一些。當某些數據是以線程為作用域並且不同線程具有不同的數據副本的時候,就可以考慮采用ThreadLocal。
ThreadLocal多並發測試
//定義一個全局變量
public ThreadLocal
threads = new ThreadLocal
(){ @Override protected ThreadTest initialValue() { return new ThreadTest(); } }; public ThreadLocal
b = new ThreadLocal
(){ @Override protected String initialValue() { return new String(); } }; @Override public ThreadTest setThreadTest(String name,int n) { ThreadTest thread = new ThreadTest(); thread.setName(name); b.set(name); thread.setPwd(b.get()); threads.set(thread); setThread2(name,n); return thread; } public void setThread2(String name,int n){ ThreadTest thread = threads.get(); if(n%2==0){ b.set(name + "---2的倍數---" + n); }else{ b.set(name + "---不是2的倍數---" + n); } thread.setPwd(b.get()); //數據庫添加操作 baseTransaction.save(thread); b.remove(); threads.remove(); }