修复: 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 com.mdd.common.util.ListUtils;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List; 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) { 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) { if (map == null) {
map = new LinkedHashMap<>(); synchronized (MY_LOCAL) {
map = new ConcurrentSkipListMap<>();
}
} }
map.put(key, val); map.put(key, val);
MY_LOCAL.set(map); MY_LOCAL.set(map);
} }

View File

@ -1,7 +1,7 @@
package com.mdd.front; package com.mdd.front;
import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentSkipListMap;
public class LikeFrontThreadLocal { 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) { 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) { if (map == null) {
map = new LinkedHashMap<>(); synchronized (MY_LOCAL) {
map = new ConcurrentSkipListMap<>();
}
} }
map.put(key, val); map.put(key, val);
MY_LOCAL.set(map); MY_LOCAL.set(map);
} }