电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java中的ThreadLocal功能演示示例

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

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

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

在本文中,會介紹有關ThreadLocal的基礎知識點點,Demo中ThreadLocal的簡單示例。

ThreadLocal簡介

很多人幾乎都沒有用過ThreadLocal類,因為在測試中能用到的地方實在太少了,而且測試腳本的性能一般來講都會很高,遠超被測服務的處理能力,所以即使全部使用synchronized也不會有任何問題。

但是ThreadLocal有很多真正的使用場景,這就是為什么將其添加到標準Java平臺庫中的原因。盡管知道現在多線程編程測試中對于ThreadLocal應用并不多,但是我會在后期多進行一些實踐,分享給各位。

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

ThreadLocal非常適合實現每個線程單例類或每個線程上下文信息(例如事務ID)。 可以將任何非線程對象包裝在ThreadLocal中,并且將其使用變為線程安全的。ThreadLocal的經典示例之一是共享SimpleDateFormat。由于SimpleDateFormat不是線程安全的,因此使用全局格式化程序可能無法正常工作,但是使用每個線程格式化程序當然可以工作。 ThreadLocal提供了另一種擴展Thread的方法。如果要保留信息或將信息從一個方法調用傳遞到另一個方法,則可以使用ThreadLocal進行傳遞。 由于不需要修改任何方法,因此可以提供極大的靈活性。

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

為了避免過多的創建和共享全局實例時的切換成本,將諸如數據庫連接之類的重對象作為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); /** * 這個是重點,通過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()); } }}控制臺輸出

INFO-> 當前用戶:fv,IP:10.60.193.37,工作目錄:/Users/fv/Documents/workspace/fun/,系統編碼格式:UTF-8,系統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

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

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

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

項目中使用

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

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功能演示示例的詳細內容,更多關于Java ThreadLocal功能的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 免费网站网址收录网_海企优网站推荐平台| 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 数控车床-立式加工中心-多功能机床-小型车床-山东临沂金星机床有限公司 | 氢氧化钙设备_厂家-淄博工贸有限公司 | 杭州可当科技有限公司—流量卡_随身WiFi_AI摄像头一站式解决方案 | 高压包-点火器-高压发生器-点火变压器-江苏天网 | 等离子空气净化器_医用空气消毒机_空气净化消毒机_中央家用新风系统厂家_利安达官网 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 塑胶地板-商用PVC地板-pvc地板革-安耐宝pvc塑胶地板厂家 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 油缸定制-液压油缸厂家-无锡大鸿液压气动成套有限公司 | 芝麻黑-芝麻黑石材厂家-永峰石业 | 陶氏道康宁消泡剂_瓦克消泡剂_蓝星_海明斯德谦_广百进口消泡剂 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 十字轴_十字轴万向节_十字轴总成-南京万传机械有限公司 | 山楂片_雪花_迷你山楂片_山楂条饼厂家-青州市丰源食品厂 | 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 打孔器,打孔钳厂家【温州新星德牌五金工具】 | 国产离子色谱仪,红外分光测油仪,自动烟尘烟气测试仪-青岛埃仑通用科技有限公司 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | LCD3D打印机|教育|桌面|光固化|FDM3D打印机|3D打印设备-广州造维科技有限公司 | 模具ERP_模具管理系统_模具mes_模具进度管理_东莞市精纬软件有限公司 | RS系列电阻器,RK_RJ启动调整电阻器,RQ_RZ电阻器-上海永上电器有限公司 | 蔡司三坐标-影像测量机-3D扫描仪-蔡司显微镜-扫描电镜-工业CT-ZEISS授权代理商三本工业测量 | 超声波清洗机_大型超声波清洗机_工业超声波清洗设备-洁盟清洗设备 | 西装定制/做厂家/公司_西装订做/制价格/费用-北京圣达信西装 | 智能监控-安防监控-监控系统安装-弱电工程公司_成都万全电子 | 体视显微镜_荧光生物显微镜_显微镜报价-微仪光电生命科学显微镜有限公司 | 高效节能电机_伺服主轴电机_铜转子电机_交流感应伺服电机_图片_型号_江苏智马科技有限公司 | 低粘度纤维素|混凝土灌浆料|有机硅憎水粉|聚羧酸减水剂-南京斯泰宝 | 高压负荷开关-苏州雷尔沃电器有限公司 | 杭州|上海贴标机-百科| 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 高压绝缘垫-红色配电房绝缘垫-绿色高压绝缘地毯-上海苏海电气 | 单机除尘器 骨架-脉冲除尘器设备生产厂家-润天环保设备 |