參考 正確理解TheadLocal 解密ThreadLocal JDK文檔 ThreadLocal
目的:解決多線程中相同變量的訪問沖突問題。 在同步機制中,通過對象的鎖機制保證同一時間只有一個線程訪問變量。這時該變量是多個線程共享的。 使用同步機制要求程序慎密地分析什么時候對變量進行讀寫,什么時候需要鎖定某個對象,什么時候釋放對象鎖等繁雜的問題。 經典案例:多生產者和多消費者。
ThreadLocal的作用是提供線程內的局部變量,這種變量在線程的生命周期內起作用,減少同一個線程內多個函數或者組件之間一些公共變量的傳遞的復雜度。
ThreadLocal不是用來解決對象共享訪問問題的,而主要是提供了保持對象的方法和避免參數傳遞的方便的對象訪問方式。(ThreadLocalVariables可能更好理解點)
個人理解:每個線程中各自用獨立的對象??梢院芊奖愕墨@取在本線程中存儲的對象,拍案驚奇?。?!應該要有一個ThreadLocalMananger,保持ThreadLocal為單例,在Handler機制里面Looper中為static final,被所有線程中Looper共享。
當某些數據是以線程為作用域并且不同線程具有不同的數據副本的時候,可以考慮采用ThreadLocal。
android中源碼ThreadLocal中。
Thread中持有TreadLocal.Values,每一個線程就有一個Values,所以每一個線程都有Object[]數組 table。通過數組角標來獲取該線程局部變量。//Sets the value of this variable for the current thread.//給當前線程設置數據(泛型T)public void set(T value) { Thread currentThread = Thread.currentThread(); //獲取當前Thread的Values Values values = values(currentThread); if (values == null) { values = initializeValues(currentThread); } //將T value存入Values中 values.put(this, value);//put()方法...}//獲取當前Thread.Values,是Thread的內部類,封裝數據用Values values(Thread current) { return current.localValues;}//Returns the value of this variable for the current thread.//get()方法,從當前Thread中獲取存儲的值public T get() { Thread currentThread = Thread.currentThread(); Values values = values(currentThread); if (values != null) { Object[] table = values.table; int index = hash & values.mask; if (this.reference == table[index]) { return (T) table[index + 1]; } }else { values = initializeValues(currentThread); } return (T) values.getAfterMiss(this);}Values initializeValues(Thread current) { return current.localValues = new Values();}新聞熱點
疑難解答