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

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

ThreadLocal的設計與使用

2019-11-18 13:33:06
字體:
來源:轉載
供稿:網友

  早在java 1.2推出之時,Java平臺中就引入了一個新的支持:java.lang.ThreadLocal,給我們在編寫多線程程序時提供了一種新的選擇。使用這個工具類可以很簡潔地編寫出美麗的多線程程序,雖然ThreadLocal非常有用,但是似乎現在了解它、使用它的朋友還不多。

  ThreadLocal是什么

  ThreadLocal是什么呢?其實ThreadLocal并非是一個線程的本地實現版本,它并不是一個Thread,而是thread local variable(線程局部變量)。也許把它命名為ThreadLocalVar更加合適。線程局部變量(ThreadLocal)其實的功用非常簡單,就是為每一個使用該變量的線程都提供一個變量值的副本,是每一個線程都可以獨立地改變自己的副本,而不會和其它線程的副本沖突。從線程的角度看,就似乎每一個線程都完全擁有該變量。線程局部變量并不是Java的新發明,在其它的一些語言編譯器實現(如IBM XL FORTRAN)中,它在語言的層次提供了直接的支持。因為Java中沒有提供在語言層次的直接支持,而是提供了一個ThreadLocal的類來提供支持,所以,在Java中編寫線程局部變量的代碼相對比較笨拙,這也許是線程局部變量沒有在Java中得到很好的普及的一個原因吧。

  ThreadLocal的設計

  首先看看ThreadLocal的接口:

  Object get() ; // 返回當前線程的線程局部變量副本 PRotected Object initialValue(); // 返回該線程局部變量的當前線程的初始值void set(Object value); // 設置當前線程的線程局部變量副本的值

  ThreadLocal有3個方法,其中值得注重的是initialValue(),該方法是一個protected的方法,顯然是為了子類重寫而特意實現的。該方法返回當前線程在該線程局部變量的初始值,這個方法是一個延遲調用方法,在一個線程第1次調用get()或者set(Object)時才執行,并且僅執行1次。ThreadLocal中的確實實現直接返回一個null:

protected Object initialValue() { return null; }
  ThreadLocal是如何做到為每一個線程維護變量的副本的呢?其實實現的思路很簡單,在ThreadLocal類中有一個Map,用于存儲每一個線程的變量的副本。比如下面的示例實現:

public class ThreadLocal
{
 private Map values = Collections.synchronizedMap(new HashMap());
 public Object get()
 {
  Thread curThread = Thread.currentThread();
  Object o = values.get(curThread);
  if (o == null && !values.containsKey(curThread))
  {
   o = initialValue();
   values.put(curThread, o);
  }
  return o;
 }

 public void set(Object newValue)
 {
  values.put(Thread.currentThread(), newValue);
 }

 public Object initialValue()
 {
  return null;
 }
}
  當然,這并不是一個工業強度的實現,但JDK中的ThreadLocal的實現總體思路也類似于此。

  ThreadLocal的使用

  假如希望線程局部變量初始化其它值,那么需要自己實現ThreadLocal的子類并重寫該方法,通常使用一個內部匿名類對ThreadLocal進行子類化,比如下面的例子,SerialNum類為每一個類分配一個序號:

public class SerialNum
{
 // The next serial number to be assigned

 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();
 }
}
  SerialNum類的使用將非常地簡單,因為get()方法是static的,所以在需要獲取當前線程的序號時,簡單地調用:

int serial = SerialNum.get();
  即可。

  在線程是活動的并且ThreadLocal對象是可訪問的時,該線程就持有一個到該線程局部變量副本的隱含引用,當該線程運行結束后,該線程擁有的所以線程局部變量的副本都將失效,并等待垃圾收集器收集。

  ThreadLocal與其它同步機制的比較

  ThreadLocal和其它同步機制相比有什么優勢呢?ThreadLocal和其它所有的同步機制都是為了解決多線程中的對同一變量的訪問沖突,在普通的同步機制中,是通過對象加鎖來實現多個線程對同一變量的安全訪問的。這時該變量是多個線程共享的,使用這種同步機制需要很細致地分析在什么時候對變量進行讀寫,什么時候需要鎖定某個對象,什么時候釋放該對象的鎖等等很多。所有這些都是因為多個線程共享了資源造成的。ThreadLocal就從另一個角度來解決多線程的并發訪問,ThreadLocal會為每一個線程維護一個和該線程綁定的變量的副本,從而隔離了多個線程的數據,每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的整個變量封裝進ThreadLocal,或者把該對象的特定于線程的狀態封裝進ThreadLocal。

  由于ThreadLocal中可以持有任何類型的對象,所以使用ThreadLocal get當前線程的值是需要進行強制類型轉換。但隨著新的Java版本(1.5)將模版的引入,新的支持模版參數的ThreadLocal<T>類將從中受益。也可以減少強制類型轉換,并將一些錯誤檢查提前到了編譯期,將一定程度地簡化ThreadLocal的使用。

  總結

  當然ThreadLocal并不能替代同步機制,兩者面向的問題領域不同。同步機制是為了同步多個線程對相同資源的并發訪問,是為了多個線程之間進行通信的有效方式;而ThreadLocal是隔離多個線程的數據共享,從根本上就不在多個線程之間共享資源(變量),這樣當然不需要對多個線程進行同步了。所以,假如你需要進行多個線程之間進行通信,則使用同步機制;假如需要隔離多個線程之間的共享沖突,可以使用ThreadLocal,這將極大地簡化你的程序,使程序更加易讀、簡潔。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性xxxx极品高清hd直播| 国产91亚洲精品| 色婷婷亚洲mv天堂mv在影片| 欧美成人精品不卡视频在线观看| 亚洲色图日韩av| 中文字幕免费精品一区| 精品国产一区二区三区在线观看| 亚洲国产日韩欧美在线图片| 国产一区二区三区免费视频| 日韩欧美在线中文字幕| 亚洲一区二区三| 欧美国产日韩一区二区三区| 色无极亚洲影院| 亚洲久久久久久久久久久| 精品无码久久久久久国产| 日本一欧美一欧美一亚洲视频| 亚洲一区久久久| 亚洲色在线视频| 奇米一区二区三区四区久久| 国产美女主播一区| 91九色精品视频| 成人网在线视频| 国产精品网红直播| 精品中文字幕在线观看| 在线看片第一页欧美| 国产一区二区三区网站| 久久免费国产视频| 日韩欧美在线一区| 中文字幕欧美日韩va免费视频| 亚洲电影免费观看| 91高潮在线观看| 日韩专区在线观看| 国产精品久久二区| 欧美黄色三级网站| 欧美精品在线免费播放| 精品久久久香蕉免费精品视频| 日本久久久久亚洲中字幕| 一区二区三区国产视频| 亚洲精品理论电影| 都市激情亚洲色图| 亚洲国产成人精品久久久国产成人一区| 日韩精品一区二区三区第95| 欧美性猛交xxxx黑人| 黄色一区二区在线观看| 琪琪亚洲精品午夜在线| 亚洲综合小说区| 亚洲第一av在线| 日韩精品极品在线观看播放免费视频| 国产精品三级美女白浆呻吟| 久久人人爽亚洲精品天堂| 黑丝美女久久久| 日韩av在线天堂网| 亚洲精品小视频在线观看| 国产成人一区二区三区| 国自在线精品视频| 欧美日韩国产影院| 在线观看成人黄色| 亲子乱一区二区三区电影| 亚洲欧美制服第一页| 欧美乱大交xxxxx另类电影| 国产日韩欧美黄色| 日本久久久久久久| 日韩麻豆第一页| 一个人看的www久久| 日韩美女在线看| 欧美日韩在线视频一区二区| 欧洲精品久久久| 国产精品国产三级国产aⅴ9色| 亚洲天堂av在线免费观看| 日韩av在线导航| 精品少妇v888av| 亚洲国产欧美精品| 中文字幕日韩av综合精品| 亚洲一区二区久久| 97视频在线播放| 国产精品久久久精品| 韩国美女主播一区| 国产黑人绿帽在线第一区| 韩剧1988免费观看全集| 色婷婷久久一区二区| 亚洲视频日韩精品| 国产精品午夜一区二区欲梦| 日韩精品www| 成人羞羞国产免费| 国产一区二区三区日韩欧美| 久热精品视频在线免费观看| 亚洲精品视频二区| 国产一区深夜福利| 久久精品国产亚洲一区二区| 国产精品久久久久影院日本| 欧美激情一区二区三级高清视频| 一区二区三区动漫| 日韩欧美在线免费观看| 青青草99啪国产免费| 国产精品视频网| 国产精品久久久久久网站| 91香蕉亚洲精品| 国产精品成久久久久三级| 亚洲欧美日韩一区在线| 国产v综合v亚洲欧美久久| 亚洲高清久久网| 欧美日韩国产91| 亚洲欧洲xxxx| 亚洲免费影视第一页| 中文字幕av日韩| 亚洲大胆美女视频| 一本一本久久a久久精品牛牛影视| 久久国产精品免费视频| 91精品国产自产在线老师啪| 国产丝袜一区二区三区免费视频| 亚洲r级在线观看| 亚洲激情国产精品| 亚洲人成在线观看| 高清欧美性猛交xxxx黑人猛交| 一本色道久久综合狠狠躁篇的优点| 国模视频一区二区三区| 久久精品久久久久久| 欧美激情videoshd| 色樱桃影院亚洲精品影院| 日韩av成人在线观看| 亚洲电影免费观看高清完整版在线观看| 91产国在线观看动作片喷水| 亚洲午夜色婷婷在线| 日韩av影院在线观看| 亚洲欧美另类自拍| 成人亚洲综合色就1024| 91精品国产91久久久久久不卡| 精品国产91乱高清在线观看| 日本亚洲欧美成人| 久久精品电影一区二区| 国产精品白丝av嫩草影院| 亚洲欧美日韩爽爽影院| 日韩精品免费在线| www.日韩.com| 亚洲人成电影网站色xx| 九九视频直播综合网| 亚洲变态欧美另类捆绑| 欧美激情精品久久久久久久变态| 日韩中文字幕av| 精品国产福利视频| 国产丝袜精品第一页| 久热99视频在线观看| 久久精品亚洲精品| 国产精品久久久久久中文字| 欧美激情视频给我| 国产精品h在线观看| 激情懂色av一区av二区av| 亚洲www视频| 欧美激情videoshd| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲综合日韩在线| 国产一区av在线| 亚洲欧美中文字幕在线一区| 欧美性猛交xxxx富婆| 欧美另类在线观看| 伊人亚洲福利一区二区三区| 国产偷国产偷亚洲清高网站| 全球成人中文在线| 欧美在线一级va免费观看| 欧美精品一二区| 精品女厕一区二区三区| 亚洲欧美色婷婷| 欧美日韩黄色大片| 欧美成人在线网站|