1. 程式人生 > 實用技巧 >CentOS7安裝postgreSQL11

CentOS7安裝postgreSQL11

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();
    }

}