AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

深度解析Java Thread Locals工作原理

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

一、前言

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

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

二、ThreadLocal類

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

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

下面是我們?nèi)绾螢橐粋€(gè)線程設(shè)置和獲取user。該示例顯示user變量被設(shè)置為用戶對象bob。在同一線程中,如果我們調(diào)用get()方法,就會(huì)檢索到用戶bob。uya28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

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

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

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

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

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

三、ThreadLocal和子線程

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

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

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

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

四、InheritableThreadLocal類

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

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

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

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

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

五、注意事項(xiàng)

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

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

然而,還有一種更安全的方法。我們可以在創(chuàng)建InheritableThreadLocal時(shí)指定一個(gè)childValue(..)方法。事實(shí)上,在下面的示例中,我們同時(shí)指定了一個(gè)初始值和一個(gè)子值。uya28資訊網(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());    }};

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

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

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

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

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

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

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

下一篇: 暢爽領(lǐng)先游戲體驗(yàn) 玩手游就選三星 S24 Ultra

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 十個(gè)簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強(qiáng)大而靈活的功能,用于修改或增強(qiáng)函數(shù)或類的行為。裝飾器本質(zhì)上是一個(gè)函數(shù),它接受另一個(gè)函數(shù)或類作為參數(shù),并返回一個(gè)新的函數(shù)或類。它們通常用
  • 如何使用JavaScript創(chuàng)建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經(jīng)瀏覽過購物網(wǎng)站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區(qū)域,以便瀏覽。結(jié)合這個(gè)小小的重要功能可以大大改善您網(wǎng)站的用戶體驗(yàn)
  • 多線程開發(fā)帶來的問題與解決方法

    使用多線程主要會(huì)帶來以下幾個(gè)問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結(jié)束訪問某一數(shù)據(jù)期間,該數(shù)據(jù)被其他的線程所修改,那么對于當(dāng)前線程而言,該線程
  • 微軟邀請 Microsoft 365 商業(yè)用戶,測試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業(yè)用戶,開放 Clipchamp 應(yīng)用,邀請用戶通過該應(yīng)用來編輯視頻。微軟于 2021 年收購 Clipchamp,隨后開始逐步整合到 Microsof
  • Temu起訴SHEIN,跨境電商戰(zhàn)事升級

    來源 | 伯虎財(cái)經(jīng)(bohuFN)作者 | 陳平安日前據(jù)外媒報(bào)道,拼多多旗下跨境電商平臺Temu正對競爭對手SHEIN提起新訴訟,訴狀稱Shein&ldquo;利用市場支配力量強(qiáng)迫服裝廠商與之簽訂獨(dú)家
  • 10天營收超1億美元,《星鐵》比《原神》差在哪?

    來源:伯虎財(cái)經(jīng)作者:陳平安即便你沒玩過《原神》,你一定聽說過的它的大名。恨它的人把《原神》開服那天稱作是中國游戲史上最黑暗的一天,有粉絲因?yàn)樗髂嵩赑S平臺上線《原神》,怒而
  • 三星獲批量產(chǎn)iPhone 15全系屏幕:蘋果史上最驚艷直屏

    按照慣例,蘋果將繼續(xù)在今年9月舉辦一年一度的秋季新品發(fā)布會(huì),有傳言稱發(fā)布會(huì)將于9月12日舉行,屆時(shí)全新的iPhone 15系列將正式與大家見面,不出意外的話
  • 三星Galaxy Z Fold5官方渲染圖曝光:13.4mm折疊厚度依舊感人

    據(jù)官方此前宣布,三星將于7月26日在韓國首爾舉辦Unpacked活動(dòng),屆時(shí)將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • 蘋果140W USB-C充電器:采用氮化鎵技術(shù)

    據(jù)10 月 30 日 9to5 Mac 消息報(bào)道,當(dāng)蘋果推出新的 MacBook Pro 2021 時(shí),該公司還推出了新的 140W USB-C 充電器,附贈(zèng)在 MacBook Pro 16 英寸機(jī)型的盒子里,也支
Top