歡迎使用CSDN markdown編輯器

2021-07-28 00:00:25 字數 2317 閱讀 7244

好久沒更新部落格了,一直都有學習新知識,但是沒時間總結,主要因為顧著去發展模型興趣去了哈

難得靜下來寫一篇部落格

閒話不多說,直接進入主題

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頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...