Java-ThreadLocal

簡述

一種線程綁定機制,每個線程都擁有對象的獨立副本,不會與其他線程沖突,從而避免了并發(fā)與同步問題。

結構

ThreadLocal結構.png

每個線程都有一個ThreadLocalMap,其中Key為ThreadLocal對象,Value為用戶對象的值

****ThreadLocal只是作為Key標識,并不存放任何數(shù)據(jù),真正存放數(shù)據(jù)的是每個線程中的ThreadLocalMap。所以ThreadLocal一般應該定義成靜態(tài)變量。****

也不是一般人認為的Key是線程的名字或者標識

實現(xiàn)

public class ThreadLocal<T> {
  public T get() {
    // 獲取當前線程
    Thread t = Thread.currentThread();
    // 從當前線程中獲取ThreadLocalMap變量
    ThreadLocalMap map = getMap(t);
    if (map != null) {
      // 以當前的ThreadLocal對象作為Key,從Map中獲取對應的值
      ThreadLocalMap.Entry e = map.getEntry(this);
      if (e != null)
        return (T)e.value;
    }
    return setInitialValue();
  }

  public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
      map.set(this, value);
    else
      createMap(t, value);
    }
      
    ThreadLocalMap getMap(Thread t) {
      return t.threadLocals;
    }
}

public class Thread implements Runnable {
  // 每個線程都有一個ThreadLocalMap對象
  ThreadLocal.ThreadLocalMap threadLocals = null;
}

應用

  1. 避免同步或每次使用都創(chuàng)建新對象
    針對Random、DateFormatter等非線程安全類,實現(xiàn)每個線程一個對象
    數(shù)據(jù)庫連接等資源限制類,實現(xiàn)每個線程一個連接

  2. 線程內(nèi)跨方法的數(shù)據(jù)傳遞
    例如Hibernate的Session綁定(實現(xiàn)延遲加載和事務處理,保證整個處理過程使用同一個session)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 轉載:http://www.codeceo.com/article/java-threadlocal-deep-l...
    Jannonx閱讀 451評論 0 2
  • ThreadLocal提供了線程本地變量,它可以保證訪問到的變量屬于當前線程,每個線程都保存有一個變量副本,每個線...
    FX_SKY閱讀 15,616評論 0 3
  • 從三月份找實習到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,814評論 11 349
  • Java-ThreadLocal 參考 A Painless Introduction to Java's Thr...
    xiaofudeng閱讀 481評論 1 0
  • 今天用兩點透視畫字母偶的作品: 畫的太扁,不好看!前幾天有朋友希望我能上過程圖,那就把我臨摹的過程圖上一下,看看是...
    friendly99閱讀 666評論 7 13

友情鏈接更多精彩內(nèi)容