CentOS7安裝postgreSQL11
阿新 • • 發佈:2020-08-24
ThreadLocal
ThreadLocal 是 jdk1.8及之後版本的API
從名字我們就可以看到ThreadLocal叫做執行緒變數,意思是ThreadLocal中填充的變數屬於當前執行緒,該變數對其他執行緒而言是隔離的。ThreadLocal為變數在每個執行緒中都建立了一個副本,那麼每個執行緒可以訪問自己內部的副本變數。
物件建立
格式:
private static ThreadLocal<User> threadLocal = new ThreadLocal<>();
建立此物件需要一個泛型, 來指定ThreadLocal可以儲存的資料, 如果需要儲存多個數據, 泛型變數可以使用Map型別
核心方法
返回值 | 方法 | 說明 |
---|---|---|
void | set(T value) |
存入資料 |
T | get() |
獲取資料 |
void | remove() |
清除資料 |
實際應用
例如在springboott的同一次請求中, 使用同一個ThreadLocal物件在Controller中set一個數據, 可以在service中獲取到這個資料
封裝工具類
單個物件
例如只能存User物件
public class UserThreadLocal { // 1. 定義本地執行緒物件 private static ThreadLocal<User> threadLocal = new ThreadLocal<>(); // 2. 定義資料新增的方法 public static void set(User user) { threadLocal.set(user); } // 3. 獲取資料 public static User get() { return threadLocal.get(); } // 4. 移除方法 使用threadLocal時切記將資料移除, // 否則極端條件下, 容易產生記憶體洩露的風險 public static void remove() { threadLocal.remove(); } }
多個物件
使用map儲存多個數據
public class ThreadLocalUtil { private static ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>(); static { threadLocal.set(new HashMap<String, Object>()); } public static void set(String key, Object value) { threadLocal.get().put(key, value); } public static Object get(String key) { return threadLocal.get().get(key); } public static void remove() { threadLocal.remove(); } }