国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

Java中的ThreadLocal功能演示示例

瀏覽:91日期:2022-08-17 09:27:19

除了使用synchronized同步符號外,Java中的ThreadLocal是另一種實(shí)現(xiàn)線程安全的方法。在進(jìn)行性能測試用例的編寫過程中,比較簡單的辦法就是直接使用synchronized關(guān)鍵字,修飾對象、方法以及類。但是使用synchronized同步,這可能會(huì)影響應(yīng)用程序的可伸縮性以及運(yùn)行效率。但是如果要在多個(gè)線程之間共享對象又要保障線程安全,則除了synchronized之外沒有特別適合測試的方法。

Java中的ThreadLocal是實(shí)現(xiàn)線程安全的另一種方法,它不滿足同步要求,而是通過為每個(gè)線程提供Object的顯式副本來消除共享。由于不再共享對象,因此不需要同步,它可以提高應(yīng)用程序的可伸縮性和運(yùn)行效率。

在本文中,會(huì)介紹有關(guān)ThreadLocal的基礎(chǔ)知識點(diǎn)點(diǎn),Demo中ThreadLocal的簡單示例。

ThreadLocal簡介

很多人幾乎都沒有用過ThreadLocal類,因?yàn)樵跍y試中能用到的地方實(shí)在太少了,而且測試腳本的性能一般來講都會(huì)很高,遠(yuǎn)超被測服務(wù)的處理能力,所以即使全部使用synchronized也不會(huì)有任何問題。

但是ThreadLocal有很多真正的使用場景,這就是為什么將其添加到標(biāo)準(zhǔn)Java平臺(tái)庫中的原因。盡管知道現(xiàn)在多線程編程測試中對于ThreadLocal應(yīng)用并不多,但是我會(huì)在后期多進(jìn)行一些實(shí)踐,分享給各位。

以下是Java中ThreadLocal類的一些眾所周知的用法:

ThreadLocal非常適合實(shí)現(xiàn)每個(gè)線程單例類或每個(gè)線程上下文信息(例如事務(wù)ID)。 可以將任何非線程對象包裝在ThreadLocal中,并且將其使用變?yōu)榫€程安全的。ThreadLocal的經(jīng)典示例之一是共享SimpleDateFormat。由于SimpleDateFormat不是線程安全的,因此使用全局格式化程序可能無法正常工作,但是使用每個(gè)線程格式化程序當(dāng)然可以工作。 ThreadLocal提供了另一種擴(kuò)展Thread的方法。如果要保留信息或?qū)⑿畔囊粋€(gè)方法調(diào)用傳遞到另一個(gè)方法,則可以使用ThreadLocal進(jìn)行傳遞。 由于不需要修改任何方法,因此可以提供極大的靈活性。

沒有兩個(gè)線程可以看到彼此的ThreadLocal變量。J2EE應(yīng)用程序服務(wù)器中有一個(gè)ThreadLocal的真實(shí)示例,該服務(wù)器使用Java ThreadLocal變量來跟蹤事務(wù)和安全上下文。

為了避免過多的創(chuàng)建和共享全局實(shí)例時(shí)的切換成本,將諸如數(shù)據(jù)庫連接之類的重對象作為ThreadLocal共享是很有意義的。

ThreadLocal演示Demo

package com.fun.ztest.java;import com.fun.frame.SourceCode;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;/** * ThreadLocal演示測試類 */public class FunTester extends SourceCode { public static Logger logger = LoggerFactory.getLogger(FunTester.class); /** * 這個(gè)是重點(diǎn),通過ThreadLocal類重建線程私有的對象 */ private static final ThreadLocal<Object> format = new ThreadLocal() { @Override protected Object initialValue() { Object funTester = new Object(); logger.info('初始化對象,線程: {} 對象: {}', Thread.currentThread().getName(), funTester.hashCode()); return funTester; } }; public static void main(String args[]) throws IOException, InterruptedException { for (int i = 0; i < 5; i++) { Thread t = new Thread(new Fun()); t.start(); } } /** * 獲取對象 * * @return */ public static Object get() { return format.get(); } static class Fun implements Runnable { @Override public void run() { logger.info('線程: {} 對象: {}', Thread.currentThread().getName(), FunTester.get().hashCode()); } }}控制臺(tái)輸出

INFO-> 當(dāng)前用戶:fv,IP:10.60.193.37,工作目錄:/Users/fv/Documents/workspace/fun/,系統(tǒng)編碼格式:UTF-8,系統(tǒng)Mac OS X版本:10.16INFO-> 初始化對象,線程: Thread-1 對象: 347384150INFO-> 初始化對象,線程: Thread-2 對象: 142607688INFO-> 線程: Thread-1 對象: 347384150INFO-> 線程: Thread-2 對象: 142607688INFO-> 初始化對象,線程: Thread-3 對象: 1008357237INFO-> 初始化對象,線程: Thread-4 對象: 559951532INFO-> 線程: Thread-3 對象: 1008357237INFO-> 線程: Thread-4 對象: 559951532INFO-> 初始化對象,線程: Thread-5 對象: 748958847INFO-> 線程: Thread-5 對象: 748958847Process finished with exit code 0

如果查看上述程序的輸出,則會(huì)發(fā)現(xiàn),當(dāng)不同的線程調(diào)用ThreadLocal類的get()方法而不是調(diào)用其initialValue()方法時(shí),該方法將為該線程創(chuàng)建Object的互斥實(shí)例對象。 由于Object在線程之間不共享,并且實(shí)質(zhì)上在創(chuàng)建它自己的線程安全對象或者方法的線程本地是完全線程安全的。

ThreadLocal類知識點(diǎn) Java的ThreadLocal在JDK 1.2上引入,但后來在JDK 1.4中進(jìn)行了泛化,以在ThreadLocal變量上引入類型安全性。 ThreadLocal通常與Thread一起使用,由Thread執(zhí)行的所有代碼都可以訪問ThreadLocal變量,但是兩個(gè)線程看不到彼此的ThreadLocal變量。 每個(gè)線程都擁有ThreadLocal變量的互斥副本,該副本在線程完成或死亡(正常情況下或由于任何異常)后才有進(jìn)行垃圾回收,因?yàn)檫@些ThreadLocal變量沒有任何其他線程引用。 Java中的ThreadLocal變量通常是類中的私有靜態(tài)字段,并在Thread中維護(hù)其狀態(tài)。

不要誤解ThreadLocal是Synchronization的替代方法,它全部取決于你自己的程序設(shè)計(jì)。如果設(shè)計(jì)允許每個(gè)線程擁有自己的對象副本,則可以使用ThreadLocal。

項(xiàng)目中使用

這里一個(gè)處理requestid的類,通過ThreadLocal使用,可以保證每個(gè)請求都擁有唯一的一個(gè)追蹤標(biāo)記。

public class TraceKeyHolder { private static ThreadLocal<String> threadLocal = new ThreadLocal(); public TraceKeyHolder() { } public static String getTraceKey() { return (String)threadLocal.get(); } public static void setTraceKey(String traceKey) { threadLocal.set(traceKey); } public static void clear() { threadLocal.remove(); }}

以上就是Java中的ThreadLocal功能演示示例的詳細(xì)內(nèi)容,更多關(guān)于Java ThreadLocal功能的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 久久香蕉国产精品一区二区三 | a级毛片免费观看在线播放 a级毛片免费看 | 小屁孩cao大人免费网站 | 国产一区二区三区精品视频 | 国产自约视频 | 国产特黄1级毛片 | 一区二区国产在线播放 | 台湾三级香港三级经典三在线 | 国产亚洲欧美一区二区 | 国内精品1区1区3区4区 | 国产精品资源手机在线播放 | 欧美日本视频一区 | 久久久久无码国产精品一区 | aaaa毛片| 免费一级欧美大片视频在线 | 日本经典在线三级视频 | 一个人看的日本免费视频 | 色视频一区二区三区 | 日本韩国中文字幕 | 黄色视屏免费 | 国产一线视频在线观看高清 | 亚洲欧美日韩国产vr在线观 | 久久网免费视频 | 久久精品在现线观看免费15 | 欧美久久久久久久一区二区三区 | 亚洲精品线在线观看 | 三级视频网站在线观看播放 | 国产日韩精品一区二区 | 午夜国产视频 | 波多野结衣一区二区三区88 | 成年人视频在线观看免费 | 美女网站在线 | 亚洲在线一区二区三区 | 成人网18免费网站 | 国内自拍亚洲 | 亚洲骚片 | 中文字幕日韩欧美一区二区三区 | 久久在线免费 | 精品综合久久久久久蜜月 | 久久ri精品高清一区二区三区 | 国产成人精品视频免费大全 |