天天看點

簡談Thread Local工作原理簡談Thread Local工作原理

簡談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對象傳遞給子線程中去,是以能夠列印這句話。

簡談Thread Local工作原理簡談Thread Local工作原理

LocalValues内部有個數組:private Object[] table,Thread local的值就存儲在這個table數組中

簡談Thread Local工作原理簡談Thread Local工作原理

取出目前線程LocalValues對象,如果為null,傳回初始值,如果不為空,從table數組中取出Thread Local值

總結

Thread Local所做的讀寫操作僅限于各自線程的内部,是以在多個線程中互補幹擾的存儲和修改資料。

聲明

此文是建立在《Android開發藝術探索》和

http://droidyue.com/blog/2016/03/13/learning-threadlocal-in-java/

這篇文章基礎上的讀書筆記。(PS:準大三狗真是累!hh)

繼續閱讀