簡談Thread Local工作原理
- 什麼是Thread Local?
- Thread Local 是一個線程内部的資料存儲類,每一個線程都維護一個table[],通過set(),get()方法實作存取操作。
- 隻能在指定的線程中擷取存儲的資料,其他的線程一般無法擷取。(注意:這裡我用的是一般,可以使用InheritableThreadLocal達到其他線程擷取資料的)
- 什麼情況下使用Thread Local呢?
- 一般來說,當某些資料以線程為作用域并且不同線程具有不同的資料副本時,就考慮用它了
- 典型的例子是:Handler要擷取目前線程的Looper,Looper的作用域為線程,每個線程具有不同的Looper.
Thread Local的使用方法
private void testThreadLocal() {
new Thread(new Runnable() {
//建立ThreadLocal 對象,支援泛型
ThreadLocal<String> mLocal = new ThreadLocal<String>();
@Override
public void run() {
mLocal.set("Fan Bin Bin is nice!");
String s = mLocal.get();
Log.i("TAG", s);
}
}).start();
}
列印結果:
threadlocaltest I/TAG: Fan Bin Bin is nice!
有一個特殊的例子可以實作不同線程的通路存儲變量
private void testThreadLocal() {
final ThreadLocal<String> local = new InheritableThreadLocal<>();
local.set("I love China");
new Thread(new Runnable() {
@Override
public void run() {
Log.i("TAG", local.get() + "");
}
}).start();
}
列印結果:
com.yutianwang.threadlocaltest I/TAG: I love China
這裡在主線程中建立了InheritableThreadLocal對象,居然在子線程中能夠列印出這句話,實作原理大緻是:當子線程建立的時候,主線程會将InheritableThreadLocal對象傳遞給子線程中去,是以能夠列印這句話。

LocalValues内部有個數組:private Object[] table,Thread local的值就存儲在這個table數組中
取出目前線程LocalValues對象,如果為null,傳回初始值,如果不為空,從table數組中取出Thread Local值
總結
Thread Local所做的讀寫操作僅限于各自線程的内部,是以在多個線程中互補幹擾的存儲和修改資料。
聲明
此文是建立在《Android開發藝術探索》和
http://droidyue.com/blog/2016/03/13/learning-threadlocal-in-java/
這篇文章基礎上的讀書筆記。(PS:準大三狗真是累!hh)