日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java多线程之ThreadLoal详解

發布時間:2025/3/12 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多线程之ThreadLoal详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、ThreadLocal簡介

多線程訪問同一個共享變量時特別容易出現并發問題,特別是在多個線程需要對一個共享變量進行寫入時。為了保證線程安全,一般使用者在訪問共享變量時需要進行適當的同步

同步一般是通過加鎖來實現的,但這對用戶有一定要求,加重了使用者的負擔.使用ThredLocal就可以做到,創建一個變量后,每個線程對其訪問的時候訪問的是自己創建的變量.

如果你創建了一個ThreadLocal變量,那么訪問這個變量的每個線程都會擁有一個這個變量的副本.操作的時候也是操作的屬于自己這個線程的變量,從而避免了線程安全問題.


二、ThreadLocal使用示例

package ThreadLocalTest;public class ThreadLocalTest {static void print(String str) {//1.1 打印當前線程本地內存中localVariable變量的值System.out.println(str + ":" + localVariable.get());//清除當前線程本地內存中的localVariable的值//localVariable.remove();}// 創建ThreadLocal變量static ThreadLocal<String> localVariable = new ThreadLocal<String>();// 創建線程onepublic static void main(String[] args) {Thread threadOne = new Thread(new Runnable() {@Overridepublic void run() { // 設置線程One中本地變量loalVariable的值localVariable.set("threadOne local variable"); // 調用打印函數print("threadOne"); // 打印本地變量值System.out.println("threadOne remove after" + ":" + localVariable.get());}}); // 創建線程twoThread threadTwo = new Thread(new Runnable() {@Overridepublic void run() { // 設置線程Two中本地變量loalVariable的值localVariable.set("threadTwo local variable"); // 調用打印函數print("threadTwo"); // 打印本地變量值System.out.println("threadTwo remove after" + ":" + localVariable.get());}}); // 啟動線程threadOne.start();threadTwo.start();} }

運行結果如下

threadOne:threadOne local variable threadOne remove after:threadOne local variable threadTwo:threadTwo local variable threadTwo remove after:threadTwo local variable

線程One中的代碼3.1通過set方法設置了localVariable的值,這其實設置的是線程One本地內存中的一個副本,這個副本線程Two是訪問不了的。然后代碼3.2調用了print函數,代碼1.1通過get函數獲取了當前線程(線程One)本地內存中localVariable的值。

線程Two的執行類似于線程One。

將localVariable.remove 這一句代碼的注釋刪除

static void print(String str) {//1.1 打印當前線程本地內存中localVariable變量的值System.out.println(str + ":" + localVariable.get());//清除當前線程本地內存中的localVariable的值//localVariable.remove();}

運行結果如下所示:

threadOne:threadOne local variable threadOne remove after:null threadTwo:threadTwo local variable threadTwo remove after:null

三、ThreadLocal實現原理

首先看一下ThreadLocal相關類的類圖結構

由該圖可知,Thread類中有一個threadLocals和一個inheritableThreadLocals,它們都是ThreadLocalMap類型的變量.而ThreadLocalMap是一個定制化的Hashmap。在默認情況下,每個線程中的這兩個變量都為null,只有當前線程第一次調用ThreadLocal的set或者get方法時才會創建它們。其實每個線程的本地變量不是存放在ThreadLocal實例里面,而是存放在調用線程的threadLocals變量里面。

也就是說,ThreadLocal類型的本地變量存放在具體的線程內存空間中。ThreadLocal就是一個工具殼,它通過set方法把value值放入調用線程的threadLocals里面并存放起來,當調用線程調用它的get方法時,再從當前線程的threadLocals變量里面將其拿出來使用

如果調用線程一直不終止,那么這個本地變量會一直存放在調用線程的threadLocals變量里面,所以當不需要使用本地變量時可以通過調用ThreadLocal變量的remove方法,從當前線程的threadLocals里面刪除該本地變量。另外,Thread里面的threadLocals為何被設計為map結構?很明顯是因為每個線程可以關聯多個ThreadLocal變量。

總結

以上是生活随笔為你收集整理的java多线程之ThreadLoal详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。