好久沒更新部落格了,一直都有學習新知識,但是沒時間總結,主要因為顧著去發展模型興趣去了哈
難得靜下來寫一篇部落格
閒話不多說,直接進入主題
threadlocal是解決執行緒安全問題乙個很好的思路,threadlocal類中有乙個map,用於儲存每乙個執行緒的變數副本,map中元素的鍵為執行緒物件,而值對應執行緒的變數副本,由於key值不可重複,每乙個「執行緒物件」對應執行緒的「變數副本」,而到達了執行緒安全。
下面我們來剖析一下
首先我們要介紹一種儲存模式
這種模式是為了解決多執行緒變數共享導致執行緒安全和死鎖問題,首先看看下面的示意圖
objectx類會被多個執行緒使用到,為了避免執行緒安全以及可能的死鎖為題,我們希望每個執行緒都有自己的objectx例項。
於是我們設計出乙個**類,用來**儲存和獲取操作。
實際上jdk已經提供了上述模式的實現,那就是今天的豬腳threadlocal
首先看乙個簡單的threadlocal例子
public
class
threadspecificdateformat
};public
static date parse(string timestamp, string format) throws parseexception
public
static string format(date date, string format)
}
結合上圖看,例項的統一接入點就是threadlocal.get()(ts_sdf.get())這個方法了,通過這個接入點客戶端就能拿到object例項。
接下來再看看get方法的具體實現
public t get()
}return setinitialvalue();
}threadlocalmap getmap(thread t)
第一步 先獲通過thread.currentthread()取當前執行緒
第二步 然後獲取當前執行緒的threadlocals屬性
第三步 在threadlocals屬性裡獲取entry例項
第四部 從entry例項的value屬性裡獲取到最後所要的object物件
接下來討論一下上面出現的threadlocalmap類以及entry類,直接貼原始碼
static class threadlocalmap
}... ...
/*** the table, resized as necessary.
* table.length must always be a power of two.
*/private entry table;
/*** the number of entries in the table.
*/private
int size = 0;
... ...
}
entry是threadlocalmap的內部類,而且threadlocalmap裡擁有乙個型別為entry的table屬性,而線每個執行緒例項有自己的threadlocalmap。到這裡結論已經很明顯了,
負責儲存threadlocal的key和value根本就不是乙個map型別,而是乙個entry陣列!
entry繼承weakreference,因此繼承擁有乙個弱引用referent,而且自身也有乙個value屬性。entry利用referent來儲存threadlocal例項的弱引用,利用value儲存object的強引用
最後的問題是怎樣在entry陣列裡定位我們需要的entry呢
還是看**說話
private entry getentry(threadlocal> key)
留意key.threadlocalhashcode這個屬性,entry在儲存進entry陣列之前,會利用threadlocal的引用計算出乙個hash值,然後利用這個hash值作為下標定位到entry陣列的某個位置;
相反,從entry取entry也是同樣道理。
最後來乙個圖來總結上面說的內容
客戶端訪問threadlocal例項的get方法,get方法通過thread.getcurrentthread獲得當前執行緒的例項,從而獲得當前執行緒的threadlocalmap物件,而threadlocalmap裡包含了乙個entry陣列,裡面的每個entry儲存了threadlocal引用以及object引用,entry的referent儲存threadlocal的弱引用,entry的value儲存object的強引用。
歡迎使用CSDN markdow
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...
歡迎毛毛與妞妞使用CSDN markdown編輯器
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...
歡迎使用CSDN markdow1n編輯器
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...