亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java線程(篇外篇):線程本地變量ThreadLocal

2019-11-14 10:33:36
字體:
來源:轉載
供稿:網友

       首先說明ThreadLocal存放的值是線程內共享的,線程間互斥的,主要用于線程內共享一些數據,避免通過參數來傳遞,這樣處理后,能夠優雅的解決一些實際問題,比如hibernate中的OpensessionInView,就是使用ThreadLocal保存Session對象,還有我們經常用ThreadLocal存放Connection,代碼如:

[java] view plain copy PRint?/**  * 數據庫連接管理類  * @author 爽  *  */  public class ConnectionManager {        /** 線程內共享Connection,ThreadLocal通常是全局的,支持泛型 */      private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();            public static Connection getCurrConnection() {          // 獲取當前線程內共享的Connection          Connection conn = threadLocal.get();          try {              // 判斷連接是否可用              if(conn == null || conn.isClosed()) {                  // 創建新的Connection賦值給conn(略)                  // 保存Connection                  threadLocal.set(conn);              }          } catch (SQLException e) {              // 異常處理          }          return conn;      }            /**      * 關閉當前數據庫連接      */      public static void close() {          // 獲取當前線程內共享的Connection          Connection conn = threadLocal.get();          try {              // 判斷是否已經關閉              if(conn != null && !conn.isClosed()) {                  // 關閉資源                  conn.close();                  // 移除Connection                  threadLocal.remove();                  conn = null;              }          } catch (SQLException e) {              // 異常處理          }      }  }  

       這樣處理的好處:

統一管理Connection;不需要顯示傳參Connection,代碼更優雅;降低耦合性。

       ThreadLocal有四個方法,分別為:

initialValue

protected T initialValue()返回此線程局部變量的當前線程的初始值。最多在每次訪問線程來獲得每個線程局部變量時調用此方法一次,即線程第一次使用 get() 方法訪問變量的時候。如果線程先于 get 方法調用 set(T) 方法,則不會在線程中再調用 initialValue 方法。

該實現只返回 null;如果程序員希望將線程局部變量初始化為 null 以外的某個值,則必須為 ThreadLocal創建子類,并重寫此方法。通常,將使用匿名內部類。initialValue 的典型實現將調用一個適當的構造方法,并返回新構造的對象。

返回:返回此線程局部變量的初始值

get

public T get()返回此線程局部變量的當前線程副本中的值。如果這是線程第一次調用該方法,則創建并初始化此副本。

返回:此線程局部變量的當前線程的值

set

public void set(T value)將此線程局部變量的當前線程副本中的值設置為指定值。許多應用程序不需要這項功能,它們只依賴于initialValue() 方法來設置線程局部變量的值。

參數:value - 存儲在此線程局部變量的當前線程副本中的值。

remove

public void remove()移除此線程局部變量的值。這可能有助于減少線程局部變量的存儲需求。如果再次訪問此線程局部變量,那么在默認情況下它將擁有其 initialValue。

       很多人對ThreadLocal存在一定的誤解,說ThreadLocal中有一個全局的Map,set時執行map.put(Thread.currentThread(), value),get和remove時也同理,但SUN的大師們是否是如此實現的,我們只能去看源碼了。

       set方法:

[java] view plain copy print?/**  * Sets the current thread's copy of this thread-local variable  * to the specified value.  Most subclasses will have no need to  * override this method, relying solely on the {@link #initialValue}  * method to set the values of thread-locals.  *  * @param value the value to be stored in the current thread's copy of  *        this thread-local.  */  public void set(T value) {      // 獲取當前線程對象      Thread t = Thread.currentThread();      // 獲取當前線程本地變量Map      ThreadLocalMap map = getMap(t);      // map不為空      if (map != null)          // 存值          map.set(this, value);      else          // 創建一個當前線程本地變量Map          createMap(t, value);  }    /**  * Get the map associated with a ThreadLocal. Overridden in  * InheritableThreadLocal.  *  * @param  t the current thread  * @return the map  */  ThreadLocalMap getMap(Thread t) {      // 獲取當前線程的本地變量Map      return t.threadLocals;  }  

       這里注意,ThreadLocal中是有一個Map,但這個Map不是我們平時使用的Map,而是ThreadLocalMap,ThreadLocalMap是ThreadLocal的一個內部類,不對外使用的。當使用ThreadLocal存值時,首先是獲取到當前線程對象,然后獲取到當前線程本地變量Map,最后將當前使用的ThreadLocal和傳入的值放到Map中,也就是說ThreadLocalMap中存的值是[ThreadLocal對象, 存放的值],這樣做的好處是,每個線程都對應一個本地變量的Map,所以一個線程可以存在多個線程本地變量

       get方法:

[java] view plain copy print?/**  * Returns the value in the current thread's copy of this  * thread-local variable.  If the variable has no value for the  * current thread, it is first initialized to the value returned  * by an invocation of the {@link #initialValue} method.  *  * @return the current thread's value of this thread-local  */  public T get() {      Thread t = Thread.currentThread();      ThreadLocalMap map = getMap(t);      if (map != null) {          ThreadLocalMap.Entry e = map.getEntry(this);          if (e != null)              return (T)e.value;      }      // 如果值為空,則返回初始值      return setInitialValue();  }         有了之前set方法的分析,get方法也同理,需要說明的是,如果沒有進行過set操作,那從ThreadLocalMap中拿到的值就是null,這時get方法會返回初始值,也就是調用initialValue()方法,ThreadLocal中這個方法默認返回null。當我們有需要第一次get時就能得到一個值時,可以繼承ThreadLocal,并且覆蓋initialValue()方法。

       (完)

       本文來自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/15732053


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美另类老肥妇| 中文字幕欧美精品在线| 午夜精品福利视频| 色噜噜国产精品视频一区二区| 欧美色视频日本版| 68精品国产免费久久久久久婷婷| 91精品久久久久久久久不口人| 日韩电影第一页| 日韩一区二区久久久| 国产成人一区二区在线| 国产午夜精品一区理论片飘花| 国语自产精品视频在免费| 成人免费淫片aa视频免费| 黑人巨大精品欧美一区免费视频| 国产精品自产拍在线观| 日韩经典第一页| 国产91在线播放精品91| 国产欧美最新羞羞视频在线观看| 久久久久久久久爱| 亚洲精品720p| 久久久久久久久亚洲| 亚洲精品色婷婷福利天堂| 国产91精品久久久久久久| 国产成人精品免费久久久久| 91久久久久久久久久| 欧美大尺度激情区在线播放| 欧美日韩国产黄| 啊v视频在线一区二区三区| 久久99精品久久久久久琪琪| 亚洲激情视频网站| 日韩精品极品毛片系列视频| 国产美女久久精品香蕉69| 日本不卡高字幕在线2019| 亚洲成人黄色网| 国产成人+综合亚洲+天堂| 国产精品激情av在线播放| 538国产精品视频一区二区| 色一情一乱一区二区| 成人黄色免费看| 亚洲精品www久久久| 亚洲一区制服诱惑| 成人午夜在线视频一区| 丝袜美腿亚洲一区二区| 91精品视频播放| 色天天综合狠狠色| 亚洲综合自拍一区| 亚洲精品成a人在线观看| 91成人在线播放| 欧美成人午夜免费视在线看片| 成人福利在线视频| 日韩欧美在线免费| 91国产在线精品| 国产精品一二三视频| 国产精品免费观看在线| 在线播放亚洲激情| 亚洲人永久免费| 狠狠久久亚洲欧美专区| 在线观看视频亚洲| 亚洲女人初尝黑人巨大| 日韩av免费看网站| 91在线国产电影| 成人在线小视频| 国产精品一区二区性色av| 亚洲精选在线观看| 欧美黑人国产人伦爽爽爽| 中文字幕日韩精品在线| 日韩禁在线播放| 青草青草久热精品视频在线观看| 97**国产露脸精品国产| 亚洲欧美在线磁力| 久久影视电视剧免费网站清宫辞电视| 最新69国产成人精品视频免费| 欧美第一淫aaasss性| 国产伦精品免费视频| 日本欧美精品在线| 欧美丰满少妇xxxxx| 成人h片在线播放免费网站| 欧洲美女7788成人免费视频| 在线亚洲男人天堂| 91久久精品美女| 欧美在线一区二区三区四| 51ⅴ精品国产91久久久久久| 亚洲人成毛片在线播放| 欧洲永久精品大片ww免费漫画| 国产精品ⅴa在线观看h| 国产精品丝袜久久久久久高清| 最近日韩中文字幕中文| 国产精品电影观看| 亲爱的老师9免费观看全集电视剧| 亚洲一区二区日本| 在线电影中文日韩| 91精品视频网站| 日韩中文字幕国产精品| 综合久久五月天| 欧美极品欧美精品欧美视频| 精品久久久久久久久久ntr影视| 热re99久久精品国产66热| 91精品国产免费久久久久久| 中文字幕一区二区三区电影| 欧美性高潮在线| 久久久国产视频| 一本色道久久综合亚洲精品小说| 日韩欧美高清视频| 欧美日韩一二三四五区| 久久精品国亚洲| 国产精品第一区| 国产精品久久77777| 亚洲性线免费观看视频成熟| 69国产精品成人在线播放| 国产成人久久久| 国产一区二区日韩| 国产99在线|中文| 色爱精品视频一区| 欧美大片免费观看| 久久影视电视剧免费网站清宫辞电视| 亚洲视频精品在线| 日本一区二区在线播放| 成人黄色大片在线免费观看| 国产精品jvid在线观看蜜臀| 亚洲一区二区黄| 亚洲成人激情在线| 日韩小视频在线| 欧美日本高清一区| 日本一区二区三区四区视频| 欧美另类暴力丝袜| 青青草99啪国产免费| 91精品啪aⅴ在线观看国产| 欧美成人免费大片| 亚洲国产精品va在线| 亚洲福利视频久久| 91香蕉电影院| 色午夜这里只有精品| 中文字幕亚洲天堂| 久久久精品一区| 国产v综合v亚洲欧美久久| 欧美性69xxxx肥| 亚洲自拍欧美另类| 亚洲一区二区三| 视频在线一区二区| 综合国产在线观看| 久久亚洲欧美日韩精品专区| 国产美女精品视频免费观看| 亚洲一区第一页| 国产精品美乳一区二区免费| 日韩在线观看成人| 国产精品88a∨| 97碰碰碰免费色视频| 久久九九全国免费精品观看| 69久久夜色精品国产7777| 国产精品jizz在线观看麻豆| 中文字幕欧美日韩| 国产69精品99久久久久久宅男| 亚洲国产精品va在线| 热久久99这里有精品| 国产精品美乳一区二区免费| 亚洲欧洲国产精品| 国产精品久久电影观看| 久久成年人视频| 亚洲乱码国产乱码精品精| 亚洲电影在线观看| 亚洲va电影大全| 国产精品视频久久久| 亚洲欧美变态国产另类| 欧美成人四级hd版|