1. 程式人生 > >Threadlocal使用,原理以及和thread的區別 整理附有程式碼例子

Threadlocal使用,原理以及和thread的區別 整理附有程式碼例子

根據https://www.cnblogs.com/dolphin0520/p/3920407.html整理:

自己整理了下,希望以後檢視可以方便點。整理的不是太好,你可以參考上邊的網址和他參考的網址多看看執行緒池的資料也可以把我下邊的程式碼拷到你本地執行下。我的例子中沒有用到session所以直接繫結的service如果用session或者你專案請求入口類完全可以綁定當前請求類或者會話,資料庫連線通道里邊的ThreadLocal<Connection>也可以繫結到資料來源上

ThreadLocal,很多地方叫做執行緒本地變數,也有些地方叫做執行緒本地儲存,其實意思差不多。可能很多朋友都知道ThreadLocal為變數在每個執行緒中都建立了一個副本,那麼每個執行緒可以訪問自己內部的副本變數。


Thread類中有一個成員變數threadLocals:


這個ThreadLocalMap 是ThreadLocal類中一個靜態內部類;


ThreadLocal類中最主要的就是set 方法get方法;

set方法 


這個getMap(t); 傳入一個Thread物件返回一個 ThreadLocalMap 內部類

ThreadLocal類中


 在每個執行緒Thread內部有一個ThreadLocal.ThreadLocalMap型別的成員變數threadLocals,這個threadLocals就是用來儲存實際的變數副本的,鍵值為當前ThreadLocal變數,value為變數副本(即T型別的變數)。

Thread類中



ThreadLocal類中


如果Thread類中threadLocals為空就是這個map為空的時候:


那麼就會把在當前執行緒的副本中儲存要儲存的值firstValue和當前ThreadLoal 變數給Thread類中

這樣就相當於ThreadLoal 在不同的 Thread 中有不同的副本。

ThreadLocal類中


ThreadLocal 適用於每個執行緒需要自己獨立的例項且該例項需要在多個方法中被使用,也即變數線上程間隔離而在方法或類間共享的場景。後文會通過例項詳細闡述該觀點。另外,該場景下,並非必須使用 ThreadLocal ,其它方式完全可以實現同樣的效果,只是 ThreadLocal 使得實現更簡潔。


程式碼中這個是重點:如果沒有清空容器那麼ThreadLocal 是不會為空的那麼轉賬就會出現問題,只會一個人轉賬成功,只有當前執行緒對應的ThreadLocalMap為空的時候才會為當前執行緒建立一個ThreadLocalMap的threadlocals,並將第一個值存入到當前map中,hibernate和spring中都有原始碼可以參考.



這裡是把連線通道繫結到當前執行緒。確保當前執行緒對應一個連線通道。


碼雲程式碼:

https://gitee.com/hexiaoming124/LianShou.git

相關推薦

Threadlocal使用原理以及thread區別 整理附有程式碼例子

根據https://www.cnblogs.com/dolphin0520/p/3920407.html整理:自己整理了下,希望以後檢視可以方便點。整理的不是太好,你可以參考上邊的網址和他參考的網址多看看執行緒池的資料也可以把我下邊的程式碼拷到你本地執行下。我的例子中沒有用到

export export default import 區別 以及用法

彈出 但是 clas 能夠 引用 port 模塊 返回值 兩個 首先要知道export,import ,export default是什麽 ES6模塊主要有兩個功能:export和import export用於對外輸出本模塊(一個文件可以理解為一個模塊)變量的接口 imp

export export default import 區別以及用法

默認 函數 根據 pre 可用 返回 大括號 能夠 返回值 首先要知道export,import ,export default是什麽 ES6模塊主要有兩個功能:export和importexport用於對外輸出本模塊(一個文件可以理解為一個模塊)變量的接口import用

java線程總結--synchronized關鍵字原理以及相關的鎖

public 關鍵字 多線程 java 文章 在多線程編程中,synchronized關鍵字非常常見,當我們需要進行“同步”操作時,我們很多時候需要該該關鍵字對代碼塊或者方法進行鎖定。被synchronized鎖定的代碼塊,只能同時有一條線程訪問該代碼塊。上面是很多人的認識,當然也是我之前

cookie優缺點以及session區別

性能 ssi 客戶端 破解 在服務器 減少 blog 優點 gpo 優點: 1.不需要任何服務器資源 2.輕量級 3.通過加密和SSL,減少cookie被破解的可能性 4.通過良好的編程,控制保存在cookie中的session對象的大小 缺點: 1.cookie的大小

HashMap底層原理以及與ConCurrentHashMap區別

clas put level shm segment 區別 一個 bucket link   HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashc

T-SQL查詢進階--理解SQL Server中索引的概念原理以及其他

工具 def microsoft 需要 blog b- eve 實現 中一 簡介 在SQL Server中,索引是一種增強式的存在,這意味著,即使沒有索引,SQL Server仍然可以實現應有的功能。但索引可以在大多數情況下大大提升查詢性能,在OLAP

Java之JSONObject存取值以及HashMap區別, optString()getString()區別他的遍歷方式

結論: 1.JSONObject和HashMap用法上是一樣的,用put()方法存對於的Key-values鍵值對,取可用optString(key)和getString(key),get(key),存入的是什麼型別,取出來的時候就是什麼型別 2**.optString()在沒找到k

java執行緒總結--synchronized關鍵字原理以及相關的鎖

在多執行緒程式設計中,synchronized關鍵字非常常見,當我們需要進行“同步”操作時,我們很多時候需要該該關鍵字對程式碼塊或者方法進行鎖定。被synchronized鎖定的程式碼塊,只能同時有一條執行緒訪問該程式碼塊。 上面是很多人的認識,當然也是我之前對synchronized關鍵字的淺

Java中ThreadLocal成員變數區域性變數。

一.成員變數和區域性變數 1.程式例子: public class HelloThreadTest { public static void main(String[] args) { HelloThread r = new HelloThread();

Math.round()增強for迴圈equals方法==的區別,instanceof運算子三目運算子的用法

1.Math.round() 有這樣一個問題,將數字23.4,23.6轉換成int型,得到的新數字是多少? 事實上直接轉換的話得到的數字都是23。但在我們程式設計的過程中有時候需要對數字進行四捨五入取整,那麼顯然上面的直接轉換就不能實現我們的要求。但好在java裡面給我提供了一個可以實現四捨五入

java中equals()的用法以及“==”的區別

== 的作用:   基本型別:比較的就是值是否相同   引用型別:比較的就是地址值是否相同 equals 的作用:   引用型別:預設情況下,比較的是地址值。 注:不過,我們可以根據情況自己重寫該方法。一般重寫都是自動生成,比較物件的成員變數值是否相同 public class Stri

Java多執行緒-----執行緒池的使用原理以及舉例實現(三)(四):使用樣例及如何配置執行緒池大小

三.使用示例   前面我們討論了關於執行緒池的實現原理,這一節我們來看一下它的具體使用: public class Test { public static void main(String[] args) { ThreadPoolExe

5、【資料庫技術】SQL語句中truncatedelete以及drop的區別

一、相同點     1、truncate和不帶where子句的delete、以及drop都會刪除表內的資料。     2、drop、truncate都是DDL語句(資料定義語言),執行後會自動提交。 二、不同點     1、 truncate 和 delete 只刪除資料不刪

SQL Server中索引的概念原理以及其他

在SQL Server中,索引是一種增強式的存在,這意味著,即使沒有索引,SQL Server仍然可以實現應有的功能。但索引可以在大多數情況下大大提升查詢效能,在OLAP中尤其明顯.要完全理解索引的概念,需要了解大量原理性的知識,包括B樹,堆,資料庫頁,區,填充因子,碎片

前端接收後臺傳過來的list、map物件mybatis中#$的區別

當後臺傳過來是list時,前端接收如下 var listObj = data[0];//這裡是取list中的第一條資料 當後臺傳遞過來是String(list時), var object = $.parseJSON(json); 當後臺傳遞過來的是map物件時 var name = da

深入剖析ThreadLocal實現原理以及記憶體洩漏問題

一、概述 在2017京東校園招聘筆試題中遇到了描述ThreadLocal的實現原理和記憶體洩漏的問題,之前看過ThreadLocal的實現原理,但是網上有很多文章將的很亂,其中有很多文章將ThreadLocal與執行緒同步機制混為一談,特別注意的是Thread

PHP中Session原理以及Cookie的關係

<?php echo 'test'; 就這樣一個簡單的php檔案,我們來檢視cookie的變化。 開啟瀏覽器除錯工具後,先清除之前的cookie,然後反覆重新整理頁面,發現都沒有新的cookie。 我們把test.php 程式碼修改如下:

P2P原理以及如何實現(整理

前言 這幾天看了p2p的原理以及實現的demo,整理一下。一共分為三部分,第一是概念原理,第二是demo實現,第三是p2p協議相關以及分類。一、概念原理         最近對p2p(peer to peer)技術十分感興趣,以前用VB的時候曾嘗試過學習穿透NAT方面的知識,

java之RunnableThread區別與實現方法

1、多執行緒中start()和run()方法的區別 1) start: 用start方法來啟動執行緒,真正實現了多執行緒執行,這時無需等待run方法體程式碼執行完畢而直接繼續執行下面的程式碼。通過呼叫Thread類的 start()方法來啟動一個執行緒,這時