<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 60,comments - 71,trackbacks - 0

    什么是ThreadLocal

    ThreadLocal并不能從字面上理解為線程的本地實現版本,因為它并不是一個線程,而是ThreadLocal Variable(線程局部變量)。它的功能非常簡單,就是為每一個使用該變量的線程都提供一個變量值的副本,使得每一個線程都可以獨立地改變自己的副本,而不會和其他線程珠副本沖突。從線程的角度看,就好像每一個線程都完全擁有該變量。
    首先看看ThreadLocal的方法:
    1、get()
      返回當前線程的線程局部變量的副本,當第一次調用這個方法時會自動創建并且初始化一個線程局部變量的副本。
    2、initialValue()
      返回該線程的線程局部變量的當前線程的初始值,這個方法只在第一次調用get()方法的時候被調用一次。如果在調用get()方法之前已經調用了set()方法,那么這個方法將不會被調用。
    這個方法是一個protected的方法,不能直接調用該方法,只有在其子類中將該方法重寫才能改變它的行為。在默認情況下,該方法的返回值為null。
    3、set()
      設置當前線程的線程局部變量副本的值。大多數的應用程序都不需要調用這個方法,可以通過initialValue()方法來設置當前線程局部變量的值。
    4、remove()
      移除當前線程局部變量的值。這樣做的目的是可以降低當前線程的存儲空間的使用量,這是Java1.5的新增方法。

    ThreadLocal的使用
    ThreadLocal的使用方法有兩種,一種方法是自己實現ThreadLocal的子類,并重寫initialValue()方法。另一種方法是定義一個表態的ThreadLocal實例,通過使用set()方法來初始化這個線程局部變量的值。
      如果希望線程局部變量初始化的時候就具有值,那么需要自己實現ThreadLocal的子類并重寫該方法,通常使用一個內部匿名類對ThreadLocal進行子類化。例如在下面的例子中,SerialNum類為每一個類分配一個序號:
    程序代碼 程序代碼
    public class SerialNum
    {
     private static int nextSerialNum=0;
     private static ThreadLocal serialNum=new ThreadLocal()
     {
      protected synchronized Object initialValue()
      {
       return new Integer(nextSerialNum++);
      }
     };
     public static int get()
     {
      return ((Integer)(serialNum.get())).intValue();
     }
    }

    同樣,也可以不采用實現ThreadLocal子類的方法來實現同樣的功能,如下所示:
    程序代碼 程序代碼
    public class SerialNum1
    {
     private static int nextSerialNum=0;
     private static ThreadLocal serialNum=new ThreadLocal();
     public static int get()
     {
      if(serialNum.get()==null)
       serialNum.set(new Integer(nextSerialNum++));
      return ((Integer)(serialNum.get())).intValue();
     }

    }

      SerialNum類的使用非常簡單,因為get()方法是static的,所以在需要獲取當前線程的序號時,簡單地調用int serial=SerialNum.get();即可。
      在線程是活動并且ThreadLocal對象是可訪問時,該線程就持有一個到該線程局部變量副本的隱含引用。當該線程運行結束后,該線程擁有的所有線程局部變量的副本都將失效,并等待垃圾收集器收集。

      ThreadLocal 幾點作用:
    1)可以啟到類似單態類的作用,實際上是要使某變量達到線程安全時,可以使用這種方式;
    2)可以結合HttpServletRequest,HttpServletResponse,ServletContext等來實現使用運行時數據;

    在使用ThreadLocal 時一般是使用get()方法,但在使用這個方法時,會先調用set()方法,具體的用途可以在創建ThreadLocal 變量時指定,也可以

    重寫set()方法,如果不想設定set()方法,可以在創建ThreadLocal 變量時指定,如下:

    private static ThreadLocal currentUser = new ThreadLocal(){
             
    protected synchronized Object initialValue() {
                     
    return new User();
             }

         }
    ;

    或者使用:public static void setCurrentUser(User user) { currentUser.set(user); }手工給ThreadLocal 變量賦值(user),
    要獲得User對象時,可以使用 User u = (User)currentUser.get();即直接調用get()方法,來返回set()方法所設置的值(也可以不寫
    此方法,而直接在定義變量時,重寫initialValue()方法,此方法返回所要設置的值或對象),這里是User對象,然后調用User類的其他方法.


     
    posted on 2008-05-04 20:37 henry1451 閱讀(1329) 評論(0)  編輯  收藏 所屬分類: Java技術
    主站蜘蛛池模板: 亚洲熟妇自偷自拍另欧美| 亚洲精品国产成人99久久| 免费可以在线看A∨网站| 久久不见久久见中文字幕免费| 国产精品亚洲一区二区三区在线| 久久夜色精品国产噜噜噜亚洲AV| 国产成人精品亚洲2020| 免费大片黄在线观看| 久久久久久成人毛片免费看| 扒开双腿猛进入爽爽免费视频| 丝袜熟女国偷自产中文字幕亚洲| 亚洲国产精久久久久久久| 久草免费手机视频| 亚洲午夜精品久久久久久浪潮| 亚洲天堂一区二区三区四区| 皇色在线免费视频| 日韩一级视频免费观看| 亚洲一区无码中文字幕| 美女被羞羞网站免费下载| 美女视频黄的全免费视频网站| 美腿丝袜亚洲综合| 亚洲经典千人经典日产| 日韩中文字幕免费视频| 伊人婷婷综合缴情亚洲五月| 久久精品无码精品免费专区| 亚洲熟妇无码爱v在线观看| 青青草原1769久久免费播放| 亚洲综合激情另类小说区| 免费无码又黄又爽又刺激| 视频一区二区三区免费观看| 亚洲午夜久久久影院伊人| 久久国产高潮流白浆免费观看| 亚洲性猛交XXXX| 国产大片线上免费观看| 亚洲视频在线观看免费| 噼里啪啦电影在线观看免费高清 | 国产a视频精品免费观看| 亚洲av无码乱码国产精品| 国产日韩AV免费无码一区二区三区| 久久久久久久久亚洲| 午夜无码A级毛片免费视频|