日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

深度解析Java Thread Locals工作原理

來源: 責編: 時間:2024-05-29 08:59:47 197觀看
導讀一、前言在Java中,線程本地變量的作用域是整個線程。這意味著這種變量可以從線程中的任何位置設置,并可以從同一線程的任何位置訪問。從一個線程設置的值對另一個線程是不可訪問的。我們應該知道,Java中有兩種類型的線程

一、前言

在Java中,線程本地變量的作用域是整個線程。這意味著這種變量可以從線程中的任何位置設置,并可以從同一線程的任何位置訪問。從一個線程設置的值對另一個線程是不可訪問的。Eff28資訊網(wǎng)——每日最新資訊28at.com

我們應該知道,Java中有兩種類型的線程本地類——ThreadLocal和InheritableThreadLocal。讓我們看看這兩者之間的區(qū)別。Eff28資訊網(wǎng)——每日最新資訊28at.com

二、ThreadLocal類

下面是一個如何聲明線程本地變量的示例。變量user是一個ThreadLocal變量,它保存一個User類型的變量(類或接口)。請注意,這里變量被聲明為public和static,以便user變量可以從代碼中的任何位置訪問。Eff28資訊網(wǎng)——每日最新資訊28at.com

// 聲明一個線程本地變量userpublic static final ThreadLocal user                      = new ThreadLocal<>();

下面是我們如何為一個線程設置和獲取user。該示例顯示user變量被設置為用戶對象bob。在同一線程中,如果我們調用get()方法,就會檢索到用戶bob。Eff28資訊網(wǎng)——每日最新資訊28at.com

// 設置調用線程的user值user.set(new User("bob"));// 獲取調用線程的user值User requestUser = user.get();

請注意,即使user變量對整個代碼庫是可訪問的,但set(..)方法確保傳遞給它的用戶對象與calling線程相關聯(lián)。get()方法也會檢索與calling線程相關聯(lián)的用戶對象,這就是為什么當在不同線程上調用get()方法時,它不會檢索到bob而是其他用戶(或null)的原因。每個Java線程都與一個包含該線程所有設置的線程本地變量的ThreadLocal映射相關聯(lián)。Eff28資訊網(wǎng)——每日最新資訊28at.com

如果我們在未設置任何值的情況下調用get()方法,該方法將簡單地返回null。Eff28資訊網(wǎng)——每日最新資訊28at.com

然而,你可以創(chuàng)建一個帶有Lambda Supplier的線程本地對象,它將返回一個初始的用戶對象。下面的示例顯示了一個Supplier,它返回一個名為anonymous的用戶。因此,如果在未設置值的情況下調用ThreadLocal上的get()方法,則會調用Supplier上的get()方法,并將該值設置為用戶的初始值。Eff28資訊網(wǎng)——每日最新資訊28at.com

// 聲明一個帶有Supplier的線程本地變量userpublic static ThreadLocal user           = ThreadLocal.withInitial(                () -> new User("anonymous"))// 返回AnonymousUser requestUser = user.get();

你也可以通過簡單地調用remove()方法來刪除之前設置的值,如下所示。Eff28資訊網(wǎng)——每日最新資訊28at.com

// 刪除調用線程的user值user.remove();

該方法基本上會刪除與線程相關聯(lián)的用戶對象。更重要的是,其他線程不會受到此操作的影響。Eff28資訊網(wǎng)——每日最新資訊28at.com

如果我們以圖表形式來可視化線程本地變量,它看起來會像這樣。請注意,兩個線程的user變量指向的是不同的用戶對象。Eff28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Eff28資訊網(wǎng)——每日最新資訊28at.com

三、ThreadLocal和子線程

到目前為止,我們的討論主要集中在單個Java線程上。如果一個Java線程啟動了一個新的子線程,子線程會自動能夠訪問父線程中定義的線程本地變量嗎?Eff28資訊網(wǎng)——每日最新資訊28at.com

答案是否定的!子線程無法訪問父線程的線程本地變量,這是有充分理由的。如果能夠訪問,那么存儲在線程本地變量中的對象就必須為線程安全而編寫,因為多個線程能夠訪問同一個用戶對象。這是Java工程師做出的一個很好的默認設計決策。Eff28資訊網(wǎng)——每日最新資訊28at.com

但是,在某些情況下,這種訪問是有用的。想象一個Web應用程序的場景,許多用戶正在訪問應用程序。一個單獨的Java線程與整個請求處理過程中的用戶相關聯(lián),你可以想象用戶對象存儲在線程的線程本地對象中(這是許多應用服務器和框架如Spring Boot所做的)。但是,你可能希望生成的子線程也能訪問這些用戶信息。Eff28資訊網(wǎng)——每日最新資訊28at.com

對于這種場景,Java提供了另一個名為InheritableThreadLocal的類。Eff28資訊網(wǎng)——每日最新資訊28at.com

四、InheritableThreadLocal類

使用這個類的語法與ThreadLocal類基本相同。下面的示例顯示了InheritableThreadLocal類的相應方法。Eff28資訊網(wǎng)——每日最新資訊28at.com

// 聲明一個可繼承的線程本地變量userpublic static final InheritableThreadLocal user            = new InheritableThreadLocal<>();// 設置調用線程的user值user.set(new User("bob"));// 獲取調用線程的user值User requestUser = user.get();// 刪除調用線程的user值user.remove();

與Thread Local映射一樣,每個線程也有一個用于可繼承線程本地變量的映射。這里的關鍵區(qū)別是,當創(chuàng)建子線程時,子線程的可繼承線程本地映射會從父線程克隆。因此,可繼承線程本地變量對子線程也是可訪問的。Eff28資訊網(wǎng)——每日最新資訊28at.com

如果我們以圖表形式可視化可繼承線程本地變量,它看起來會像這樣。可以看到,InheritableThreadLocal映射是從父線程克隆而來的。Eff28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Eff28資訊網(wǎng)——每日最新資訊28at.com

五、注意事項

正如上圖所清楚顯示的,可繼承線程本地變量所見到的優(yōu)勢也是一種缺點。默認情況下,當創(chuàng)建子線程時,可繼承線程本地映射也會被克隆。但是你也可以看到,user指向父線程和子線程中相同的用戶對象。Eff28資訊網(wǎng)——每日最新資訊28at.com

這意味著用戶對象可以從多個線程訪問,因此需要以線程安全的方式編寫。換句話說,如果使用InheritableThreadLocal類,之前ThreadLocal類的線程安全性就會丟失。這對于你的設計可能是完全有效的。Eff28資訊網(wǎng)——每日最新資訊28at.com

然而,還有一種更安全的方法。我們可以在創(chuàng)建InheritableThreadLocal時指定一個childValue(..)方法。事實上,在下面的示例中,我們同時指定了一個初始值和一個子值。Eff28資訊網(wǎng)——每日最新資訊28at.com

public static final InheritableThreadLocal user                    = new InheritableThreadLocal<>() {   @Override   protected User initialValue() {       return new User("anonymous");    }   @Override   protected User childValue(User parentValue) {       return new User(parentValue.getId());    }};

在這種更改下,當Inheritable Thread Local映射被克隆時,與子線程關聯(lián)的值將使用childValue(..)方法設置,該方法通過傳遞父線程的值來初始化每個Inheritable Thread Local。由于我們是從childValue(..)方法創(chuàng)建了一個新的對象,因此用戶對象不會在父線程和子線程之間共享。通過這一改變,我們恢復了線程安全性,同時也能以只讀的方式訪問用戶對象(通過有效地創(chuàng)建一個副本)。Eff28資訊網(wǎng)——每日最新資訊28at.com

同樣,如果我們以圖表形式可視化Inheritable Thread Locals,它看起來會像這樣。很明顯,現(xiàn)在用戶分別指向父線程和子線程中的不同用戶對象。Eff28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Eff28資訊網(wǎng)——每日最新資訊28at.com

希望這能讓你對Java Thread Local變量有一個較好的理解,以及它們在應用程序中如何使用。Eff28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-91379-0.html深度解析Java Thread Locals工作原理

聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Git 不要只會 Pull 和 Push,這五條提高效率的命令得掌握!

下一篇: 暢爽領先游戲體驗 玩手游就選三星 S24 Ultra

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美日韩精品欧美日韩精品一| 久久全国免费视频| 国产有码一区二区| 国产精品国产三级国产专区53| 欧美精品日韩综合在线| 欧美日韩中文字幕在线| 欧美日韩在线第一页| 国产欧美激情| 欧美性猛交xxxx免费看久久久| 牛夜精品久久久久久久99黑人| 久久亚洲午夜电影| 欧美成人一区二区三区在线观看 | 国产精品女主播一区二区三区| 国产精品第十页| 国内揄拍国内精品久久| 亚洲高清免费视频| 亚洲小少妇裸体bbw| 久久综合狠狠综合久久综青草 | 免费av成人在线| 欧美激情精品久久久久久大尺度| 欧美色图一区二区三区| 国产酒店精品激情| 亚洲国产日韩欧美| 欧美一区二区在线免费观看 | 亚洲欧美一级二级三级| 久久精品视频一| 欧美日韩视频| 亚洲一区二区视频在线| 亚洲视频香蕉人妖| 亚洲视频精选在线| 亚洲人成在线观看网站高清| 亚洲欧美日韩区| 欧美日韩国产一区二区三区| 国精品一区二区三区| 亚洲一线二线三线久久久| 欧美福利网址| 黄色免费成人| 欧美自拍偷拍| 另类图片综合电影| 在线播放视频一区| 亚洲尤物在线| 欧美另类变人与禽xxxxx| 国产一区二区三区久久 | 一本色道久久精品| 欧美 日韩 国产 一区| 国产偷自视频区视频一区二区| 在线午夜精品| 欧美色道久久88综合亚洲精品| 亚洲精品黄色| 欧美日本不卡视频| 日韩视频三区| 国产精品第十页| 欧美国产一区二区在线观看 | 在线观看视频欧美| 久久综合影视| 亚洲第一在线综合网站| 美女尤物久久精品| 亚洲人精品午夜在线观看| 欧美第十八页| 夜夜嗨av一区二区三区四季av| 欧美日韩激情小视频| 一区二区三区国产盗摄| 国产精品美女久久久久av超清 | 欧美va亚洲va香蕉在线| 国产综合欧美在线看| 久久综合狠狠综合久久综青草 | 欧美在线观看视频一区二区| 国内成人精品2018免费看| 麻豆国产精品va在线观看不卡 | 在线日韩欧美视频| 欧美激情视频在线免费观看 欧美视频免费一| 在线色欧美三级视频| 欧美日韩国产a| 99精品国产在热久久| 欧美www视频在线观看| 亚洲国产日韩欧美在线动漫| 欧美99在线视频观看| 亚洲无线视频| 在线成人免费观看| 国产精品久久久久9999| 老司机精品导航| 亚洲欧美国产日韩天堂区| 亚洲国产精品高清久久久| 国产精品区一区二区三区| 欧美成人69av| 欧美资源在线| 亚洲欧美成aⅴ人在线观看| 亚洲国产精品黑人久久久 | 欧美精品久久一区二区| 欧美在线一二三四区| 亚洲午夜精品久久| 亚洲精品视频在线观看免费| 国产一区二区中文字幕免费看| 欧美日韩亚洲精品内裤| 欧美成人精品影院| 久久久久久国产精品mv| 午夜精品久久久久久| 在线视频一区观看| 亚洲美女av电影| 亚洲三级免费观看| 一区精品久久| 在线观看av不卡| 伊甸园精品99久久久久久| 国产午夜精品久久久久久免费视| 国产精品久久久久久久午夜片| 欧美日本在线一区| 欧美精品国产精品日韩精品| 欧美成人免费va影院高清| 美女网站在线免费欧美精品| 久久久久在线| 老司机精品视频网站| 久久在线免费视频| 免费视频一区| 欧美日韩国产综合久久| 欧美色欧美亚洲另类二区| 国产精品chinese| 国产精品福利网| 欧美日韩精品免费观看视一区二区| 亚洲欧美视频一区二区三区| 亚洲综合日本| 欧美一区午夜视频在线观看| 欧美在线观看www| 久久久久久久久久久久久女国产乱 | 99视频精品| 亚洲自拍偷拍福利| 久久国产精品久久久久久| 久久亚洲精品欧美| 欧美精品亚洲| 国产农村妇女精品| 亚洲二区三区四区| 一区二区三区鲁丝不卡| 欧美一区二区三区久久精品茉莉花| 久久精品国产亚洲一区二区三区| 美国成人毛片| 国产精品高清在线| 在线看视频不卡| 亚洲制服丝袜在线| 欧美**字幕| 国产欧美一区二区精品秋霞影院 | 国模 一区 二区 三区| 亚洲狠狠丁香婷婷综合久久久| 一区二区日韩| 噜噜噜91成人网| 国产精品久久久99| 亚洲精品久久久久久一区二区| 午夜一区在线| 国产精品国产成人国产三级| 国产精品一香蕉国产线看观看| 国产精品综合不卡av| 国模套图日韩精品一区二区| 亚洲国产欧美国产综合一区| 午夜天堂精品久久久久 | 性视频1819p久久| 欧美人与性动交cc0o| 伊人婷婷久久| 午夜精品偷拍| 欧美日韩一区二区在线视频| 亚洲国产精品123| 欧美在线观看视频一区二区三区| 欧美成人中文字幕| 影音先锋欧美精品| 久久久噜久噜久久综合| 国产一区二区三区的电影 | 欧美激情1区2区| 亚洲国产精品精华液网站| 久久久精品动漫| 狠狠色狠狠色综合日日小说| 欧美亚洲日本网站| 国产亚洲精品bt天堂精选| 欧美在线观看视频一区二区| 国产精品一级二级三级| 亚洲欧美一区二区视频| 国产精品五月天| 欧美专区亚洲专区| 亚洲欧美日韩天堂一区二区| 欧美精品一区二区三| 亚洲免费av电影| 欧美日韩一区在线| 亚洲欧美怡红院| 国内揄拍国内精品久久| 欧美插天视频在线播放| 最新中文字幕一区二区三区| 欧美精品一卡| 亚洲一区二区动漫| 国产一区二区毛片| 免费在线看一区| 亚洲最新合集| 国产欧美日韩精品在线| 久久久www免费人成黑人精品| 在线电影院国产精品| 欧美理论在线播放| 欧美在线关看| 亚洲精品国产精品国产自| 国产精品麻豆欧美日韩ww | 欧美一级夜夜爽| 亚洲国产另类久久久精品极度| 欧美视频在线观看| 久久婷婷国产麻豆91天堂| 一区二区精品在线观看| 国产亚洲欧美另类中文| 欧美精品一区三区| 久久久91精品国产| 99re6热只有精品免费观看| 国产婷婷色一区二区三区|