java多线程之ThreadLoal详解
一、ThreadLocal簡介
多線程訪問同一個共享變量時特別容易出現并發問題,特別是在多個線程需要對一個共享變量進行寫入時。為了保證線程安全,一般使用者在訪問共享變量時需要進行適當的同步
同步一般是通過加鎖來實現的,但這對用戶有一定要求,加重了使用者的負擔.使用ThredLocal就可以做到,創建一個變量后,每個線程對其訪問的時候訪問的是自己創建的變量.
如果你創建了一個ThreadLocal變量,那么訪問這個變量的每個線程都會擁有一個這個變量的副本.操作的時候也是操作的屬于自己這個線程的變量,從而避免了線程安全問題.
二、ThreadLocal使用示例
運行結果如下
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详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python精要(73)-函数传递任意参
- 下一篇: 端计算(1)-wasm