日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Java ThreadLocal的使用詳解

瀏覽:16日期:2022-08-12 15:56:53
目錄1. 應用場景1.1. 保障線程安全1.2. 顯示傳遞參數2. 實現原理3. 注意事項

ThreadLocal是線程私有的局部變量存儲容器,可以理解成每個線程都有自己專屬的存儲容器,用來存儲線程私有變量。ThreadLocal 在日常開發框架中應用廣泛,但用不好也會出現各種問題,本文就此講解一下。

1. 應用場景

ThreadLocal 的常見應用場景有兩種:

多線程并發場景中,用來保障線程安全。 處理較為復雜的業務時,使用ThreadLocal代替參數的顯示傳遞。 1.1. 保障線程安全

多線程訪問同一個共享變量的時候容易出現并發問題,特別是多個線程對一個變量進行寫入的時候,為了保證線程安全,一般使用者在訪問共享變量的時候需要進行額外的同步措施才能保證線程安全性,如:synchronized、Lock之類的鎖。

ThreadLocal是除了加鎖這種同步方式之外的一種,規避多線程訪問出現線程不安全的方法。當我們在創建一個變量后,如果每個線程對其進行訪問的時候訪問的都是線程自己的變量,這樣就不會存在線程不安全問題。

ThreadLocal是JDK包提供的,它提供線程本地變量,如果創建一個ThreadLocal變量,那么訪問這個變量的每個線程都會有這個變量的一個副本,在實際多線程操作的時候,操作的是自己本地內存中的變量,從而規避了線程安全問題。

1.2. 顯示傳遞參數

這里舉幾個例子:

示例1:獲取接口的當前請求用戶在后臺接口業務邏輯的全過程中,如果需要在多個地方獲取當前請求用戶的信息。通常的一種做法就是:在接口請求時,通過過濾器、攔截器、AOP等方式,從session或token中獲取當前用戶信息,存入ThreadLocal中。

在整個接口處理過程中,如果沒有另外創建線程,都可以直接從ThreadLocal變量中獲取當前用戶,而無需再從Session、token中驗證和獲取用戶。這種方案設計不僅提高性能,最重要的是將原本復雜的邏輯和代碼實現,變得簡潔明了。例如下面的這個例子:

(1)定義ThreadLocal變量:UserProfileThread.java

public class UserProfileThread { private static ThreadLocal<UserProfile> USER_PROFILE_TL =new ThreadLocal<>(); public static void setUserProfile(UserProfile userProfile){USER_PROFILE_TL.set(userProfile); } public static UserProfile getUserProfile() {return USER_PROFILE_TL.get(); } public static String getCurrentUser() {return Optional.ofNullable(USER_PROFILE_TL.get()).map(UserProfile::getUid).orElse(UserProfile.ANONYMOUS_USER); }}

(2)在過濾器中設置變量值:

@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {UserProfile userProfile = null;// ... 驗證和獲取用戶信息 userProfileUserProfileThread.setUserProfile(userProfile);filterChain.doFilter(servletRequest, servletResponse); }

(3)獲取當前用戶信息

//獲取當前用戶String uid=UserProfileThread.getCurrentUser();//獲取當前用戶對象UserProfile user=UserProfileThread.getUserProfile();

示例2:spring框架中保證數據庫事務在同一個連接下執行

要想實現jdbc事務, 就必須是在同一個連接對象中操作,多個連接下事務就會不可控,需要借助分布式事務完成。那spring框架如何保證數據庫事務在同一個連接下執行的呢?

DataSourceTransactionManager 是spring的數據源事務管理器,它會在你調用getConnection()的時候從數據庫連接池中獲取一個connection, 然后將其與ThreadLocal綁定,事務完成后解除綁定。這樣就保證了事務在同一連接下完成。

2. 實現原理

ThreadLocal類提供set/get方法存儲和獲取value值,但實際上ThreadLocal類并不存儲value值,真正存儲是靠ThreadLocalMap這個類。

每個線程實例都對應一個TheadLocalMap實例,我們可以在同一個線程里實例化很多個ThreadLocal來存儲很多種類型的值,這些ThreadLocal實例分別作為key,對應各自的value,最終存儲在Entry table數組中。我們看看ThreadLocal的set方法:

public class ThreadLocal<T> { public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null) map.set(this, value);else createMap(t, value); } ThreadLocalMap getMap(Thread t) {return t.threadLocals; } void createMap(Thread t, T firstValue) {t.threadLocals = new ThreadLocalMap(this, firstValue); } // 省略其他方法}

set的邏輯比較簡單,就是獲取當前線程的ThreadLocalMap,然后往map里添加KV,K是當前ThreadLocal實例,V是我們傳入的value。這里需要注意一下,map的獲取是需要從Thread類對象里面取,看一下Thread類的定義。

public class Thread implements Runnable { ThreadLocal.ThreadLocalMap threadLocals = null; //省略其他}

Thread類維護了一個ThreadLocalMap的變量引用。

因此,我們可以得出如下結論:

每個線程是一個Thread實例,其內部維護一個threadLocals的實例成員,其類型是ThreadLocal.ThreadLocalMap。 ThreadLocal本身并不是一個容器,我們存取的value實際上存儲在ThreadLocalMap中,ThreadLocal只是作為TheadLocalMap的key。 3. 注意事項

ThreadLocal實例有提供remove()方法,用于回收對象,清除對應的內存占用。這個方法通常容易被忽略,而導致出現了各種問題。如下面幾種:

線程復用:在“獲取接口的當前請求用戶”的例子中,Tomcat中是通過線程池來處理用戶請求的,而線程池中線程是復用的??隙〞霈F一個線程前后被不同用戶的接口請求復用的情況,因此需要對用過的ThreaLocal變量進行覆蓋或清除。 內存溢出:由于ThreadLocalMap的生命周期跟Thread一樣長,如果創建的ThreadLocal變量很多,即對應的key占用的內存很大,但卻沒有手動刪除,到了一定程度就會導致內存泄漏。

以上就是Java ThreadLocal的使用詳解的詳細內容,更多關于Java ThreadLocal的使用的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产在线不卡| 亚洲欧美不卡| 亚洲乱码久久| 日韩精品视频在线看| 久久aⅴ国产紧身牛仔裤| 欧美日韩国产v| 亚洲一区二区三区高清| 日韩在线麻豆| 麻豆精品蜜桃视频网站| 久久wwww| 久久久久久久久丰满| 中文字幕一区日韩精品| 欧美日韩免费观看一区=区三区| 日韩精品高清不卡| 亚洲图片久久| 亚洲无线一线二线三线区别av| 在线日韩视频| 免费在线看一区| 美腿丝袜在线亚洲一区| 国产精品一区二区三区www | 精品女同一区二区三区在线观看| 国产在线|日韩| 久久中文字幕二区| 五月综合激情| 麻豆精品久久| 在线天堂资源www在线污| 免费成人性网站| 亚洲欧洲美洲国产香蕉| 日韩精品电影一区亚洲| 久久不卡日韩美女| 麻豆mv在线观看| 亚洲国产一区二区在线观看 | 久久国产中文字幕| 视频一区欧美精品| 久久国产人妖系列| 亚洲激情欧美| 日韩精品视频一区二区三区| 美女在线视频一区| 在线一区视频观看| 蜜臀久久99精品久久久久久9 | 亚洲精品视频一二三区| 国产精品对白久久久久粗| 欧美国产美女| 西西人体一区二区| 麻豆精品视频在线观看| 久久三级视频| 日韩精品导航| 久久精品国产99久久| 日本成人精品| 日韩欧美字幕| 日韩精品视频中文字幕| 国产精品亚洲欧美| 欧美性感美女一区二区| 日韩高清欧美激情| 一区二区三区国产盗摄| 国产精品观看| 亚洲精品va| 麻豆一区在线| 久久国产精品亚洲77777| 欧美成人aaa| 亚洲一区免费| 国产理论在线| 日韩高清电影一区| 久久亚洲国产| 美女精品久久| 亚洲精一区二区三区| 久久久久久色 | 精品日韩一区| 丝袜亚洲另类欧美| 国产一区二区三区视频在线| 欧美日韩黄网站| 蜜桃av.网站在线观看| 欧美在线影院| 国产精品欧美一区二区三区不卡| 性欧美69xoxoxoxo| 精品一区二区三区中文字幕视频| 国产精品美女| 精品五月天堂| 日韩在线黄色| 一区二区亚洲精品| 高潮久久久久久久久久久久久久| 亚洲一二三区视频| 日韩不卡视频在线观看| 国产剧情一区| 欧美一区=区| 久久天堂av| 麻豆精品久久久| 日韩中文av| 欧美亚洲国产精品久久| 精品精品久久| 日韩二区在线观看| 日韩亚洲在线| 日韩福利一区| 日韩精品欧美| 国产精品视频一区二区三区四蜜臂| 国产精品日韩久久久| 欧美成人a交片免费看| 欧美日韩在线精品一区二区三区激情综合 | 麻豆成全视频免费观看在线看| 中文字幕中文字幕精品| 欧美va天堂在线| 福利一区二区| 免费视频一区二区三区在线观看| 一区二区电影在线观看| 欧美/亚洲一区| 亚洲精品成人图区| 久久97视频| 国产欧美日韩一区二区三区四区| 免费久久精品视频| 国产精品普通话对白| 国产成人精品亚洲日本在线观看| 国产精品欧美三级在线观看| 视频一区国产视频| 99久久九九| 国产一区国产二区国产三区| 国产精品亚洲二区| 奇米亚洲欧美| 日韩高清成人在线| 日本在线成人| 亚洲欧美在线综合| 蜜桃av一区二区在线观看| 悠悠资源网久久精品| 91九色精品| 久久精品国语| 999国产精品永久免费视频app| 91青青国产在线观看精品| 精品久久久中文字幕| 欧美aa在线视频| 国产欧美日韩影院| 国产欧美日韩视频在线| 青青青国产精品| 日本不卡视频一二三区| 亚洲精品欧美| 青青草国产精品亚洲专区无| 欧美片网站免费| 国产精品久久久久久妇女| 日韩av中文字幕一区二区| 欧美亚洲综合视频| 国产欧美亚洲一区| 欧美成人精品一级| 久久久久久色| 国产精品porn| 久久99精品久久久野外观看| 国产乱人伦精品一区| 免费亚洲婷婷| 黄色在线网站噜噜噜| 亚洲91视频| 久久久国产亚洲精品| 亚洲高清久久| 免费成人性网站| 欧美日韩在线精品一区二区三区激情综合 | 国产一区亚洲| 久久国产精品久久久久久电车| 久久av在线| 日本a级不卡| 精品一区二区三区在线观看视频| av在线资源| 亚洲女同一区| 亚洲影院天堂中文av色| 欧美精品中文字幕亚洲专区| 日本黄色精品| 免费毛片在线不卡| 亚洲日产av中文字幕| 国产麻豆一区| 国产不卡一区| 欧美日韩国产在线观看网站| 亚洲综合精品四区| 国产香蕉精品| 精品视频亚洲| 日韩影院二区| 免费不卡在线视频| 国产精品久久久久久av公交车| 精品99在线| 亚洲精品午夜av福利久久蜜桃| 日韩精品久久理论片| 97精品国产一区二区三区| 不卡在线一区| 日本va欧美va精品| 日产精品一区| 日韩高清一区二区| 欧美天堂视频| 午夜在线视频观看日韩17c| 日本天堂一区| 麻豆mv在线观看| 蜜臀av一区二区三区| 麻豆一区二区99久久久久| 亚洲va在线| 日本午夜精品一区二区三区电影 | 日韩免费高清| 视频在线观看一区| 国产精品欧美三级在线观看| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 超碰在线99| 热久久久久久久| 久久精品毛片| 每日更新成人在线视频| 国内精品美女在线观看| 午夜国产精品视频| 精品久久国产一区| 亚洲三级毛片|