修复: ThreadLocal在高并发下重复获取对象导致put值丢失

This commit is contained in:
TinyAnts 2023-03-14 14:10:58 +08:00
parent 1d0d314aee
commit 268f46b872
2 changed files with 13 additions and 10 deletions

View File

@ -3,8 +3,9 @@ package com.mdd.admin;
import com.mdd.common.util.ListUtils;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentSkipListMap;
/**
* 本地线程
@ -19,17 +20,18 @@ public class LikeAdminThreadLocal {
/**
* 取得本地线程对象
*/
private static final java.lang.ThreadLocal<LinkedHashMap<String, Object>> MY_LOCAL = new java.lang.ThreadLocal<>();
private static final java.lang.ThreadLocal<Map<String, Object>> MY_LOCAL = new java.lang.ThreadLocal<>();
/**
* 写入本地线程
*/
public static void put(String key, Object val) {
LinkedHashMap<String, Object> map = MY_LOCAL.get();
Map<String, Object> map = MY_LOCAL.get();
if (map == null) {
map = new LinkedHashMap<>();
synchronized (MY_LOCAL) {
map = new ConcurrentSkipListMap<>();
}
}
map.put(key, val);
MY_LOCAL.set(map);
}

View File

@ -1,7 +1,7 @@
package com.mdd.front;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentSkipListMap;
public class LikeFrontThreadLocal {
@ -13,17 +13,18 @@ public class LikeFrontThreadLocal {
/**
* 取得本地线程对象
*/
private static final java.lang.ThreadLocal<LinkedHashMap<String, Object>> MY_LOCAL = new java.lang.ThreadLocal<>();
private static final java.lang.ThreadLocal<Map<String, Object>> MY_LOCAL = new java.lang.ThreadLocal<>();
/**
* 写入本地线程
*/
public static void put(String key, Object val) {
LinkedHashMap<String, Object> map = MY_LOCAL.get();
Map<String, Object> map = MY_LOCAL.get();
if (map == null) {
map = new LinkedHashMap<>();
synchronized (MY_LOCAL) {
map = new ConcurrentSkipListMap<>();
}
}
map.put(key, val);
MY_LOCAL.set(map);
}