ThreadLocal和Loop的聯(lián)動哟玷,保證了線程的隔離
ThreadLocal 可以把一個對象保存在指定的線程中粹胯,對象保存后下隧,只能在指定線程中獲取保存的數(shù)據(jù)收毫,對于其他線程來說則無法獲取到數(shù)據(jù)攻走。
日常開發(fā)中 ThreadLocal 使用的地方比較少,但是系統(tǒng)在 Handler 機(jī)制中使用了它來保證每一個 Handler 所在的線程中都有一個獨立的 Looper 對象此再,為了更好的理解 Handler 機(jī)制
其實就是這個變量的作用域是線程昔搂,其他線程訪問不了。通常我們創(chuàng)建的變量是可以被任何一個線程訪問的输拇,而使用 ThreadLocal 創(chuàng)建的變量只能被當(dāng)前線程訪問巩趁,其他線程無法訪問。
public final class Looper {
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
......
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}
}
這里通過prepare保障了sThreadLocal和Looper的唯一綁定。
public static void loop() {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
}
final MessageQueue queue = me.mQueue;
........
}
這里保證一個線程只能返回跟它唯一綁定的Looper议慰,保證了MessageQueue的唯一蠢古。