併發編程---線程封閉(棧封閉和ThreadLocal)

    在多線程環境中,若是多個線程同時訪問一個共同的可變變量,咱們稱這個變量爲共享變量,若是不作任何措施,極可能會引發線程安全問題。那麼如何解決這個線程安全問題是咱們要考慮的。咱們一般的作法是使用同步,可是咱們有沒有想過線程的安全問題是由於共享,那若是在某些場景下咱們不共享數據呢?安全

    首先咱們想到的是若是僅在單線程下訪問數據,就不須要同步,這種技術被稱爲線程封閉。它是實現線程安全的最簡單的方法。當某些對象或數據被封閉在一個線程中時,這種作法會自動實現線程安全性,就算被封閉的對象自己並非線程安全的,但因爲是在單線程內部訪問,因此它也變成了線程安全的了。多線程

    棧封閉線程

    當咱們在寫一個方法的時候,在方法內部定義了一些局部變量,咱們根據咱們所謂的經驗知道這些局部變量是線程安全的。可是爲何這些局部變量是線程安全的呢? 咱們先來了解下Jvm運行時內存的一塊區域---Java虛擬機棧。咱們一般所說的「」就是指的Java虛擬機棧,或者說是虛擬機棧中局部變量表部分。首先Java虛擬機棧是私有的,它的生命週期和線程相同。Java虛擬機棧描述的Java方法執行的內存模型每一個方法在執行時都會建立一個「棧幀」,用於存儲局部變量表、操做數棧、動態連接、方法出口等信息。每個方法從調用直至執行完成的過程,就對應這個一個棧幀在虛擬機中入棧到出棧的過程對象

     咱們回到剛纔那個問題,爲何局部變量是線程安全的呢?由於局部變量存放在虛擬機棧中,而虛擬機棧是線程私有的,既然線程不共享,因此它是線程安全的。封閉棧的線程安全性體如今Java虛擬機的內存特性。生命週期

 

    ThreadLocal類內存

    ThreadLocal也提供了線程封閉的特性,簡單的理解就是它給每一個線程都提供了一個存放線程私有變量的的區域(ThreadLocalMap),這個區域是線程私有的,ThreadLocal提供了get和set等方法來操做這些變量,get老是返回由當前線程在調用get時設置的最新值。 那麼ThreadLocal是如何來實現這種機制的呢?get

相關文章
相關標籤/搜索