簡談Thread Local工作原理
-
什么是Thread Local?
Thread Local 是一個線程內(nèi)部的數(shù)據(jù)存儲類苍匆,每一個線程都維護(hù)一個table[],通過set(),get()方法實現(xiàn)存取操作辕羽。
只能在指定的線程中獲取存儲的數(shù)據(jù)运翼,其他的線程一般無法獲取然爆。(注意:這里我用的是一般,可以使用InheritableThreadLocal達(dá)到其他線程獲取數(shù)據(jù)的)
-
什么情況下使用Thread Local呢?
一般來說七咧,當(dāng)某些數(shù)據(jù)以線程為作用域并且不同線程具有不同的數(shù)據(jù)副本時改执,就考慮用它了
典型的例子是:Handler要獲取當(dāng)前線程的Looper,Looper的作用域為線程坑雅,每個線程具有不同的Looper.
Thread Local的使用方法
private void testThreadLocal() {
new Thread(new Runnable() {
//創(chuàng)建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();
}
打印結(jié)果:
threadlocaltest I/TAG: Fan Bin Bin is nice!
有一個特殊的例子可以實現(xiàn)不同線程的訪問存儲變量
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();
}
打印結(jié)果:
com.yutianwang.threadlocaltest I/TAG: I love China
這里在主線程中創(chuàng)建了InheritableThreadLocal對象,居然在子線程中能夠打印出這句話裹粤,實現(xiàn)原理大致是:當(dāng)子線程創(chuàng)建的時候终蒂,主線程會將InheritableThreadLocal對象傳遞給子線程中去,所以能夠打印這句話遥诉。
LocalValues內(nèi)部有個數(shù)組:private Object[] table,Thread local的值就存儲在這個table數(shù)組中
取出當(dāng)前線程LocalValues對象拇泣,如果為null,返回初始值,如果不為空矮锈,從table數(shù)組中取出Thread Local值
總結(jié)
Thread Local所做的讀寫操作僅限于各自線程的內(nèi)部霉翔,所以在多個線程中互補(bǔ)干擾的存儲和修改數(shù)據(jù)。
聲明
此文是建立在《Android開發(fā)藝術(shù)探索》和
http://droidyue.com/blog/2016/03/13/learning-threadlocal-in-java/
這篇文章基礎(chǔ)上的讀書筆記苞笨。(PS:準(zhǔn)大三狗真是累债朵!hh)