问题描述
用户数据保存数据库时,禁止保存重复数据。所以保存前先查询是否有相同数据,再进行保存。
然而还是有保存两条相同数据的问题。
原因分析:
经检查,目前只找到两个保存线程同时启动的情况下,即有一个线程还没执行完,另一个线程已经查询了显示没有重复数据时,会保存两条重复数据。
至于引起原因,目前只发现一次,不知道是不是网卡了,方法执行时间很短的,正常不会这样
解决方案:
虽然用户可能不多,但还是只给单用户上锁,不去影响其他用户
import java.util.concurrent.*
private final ConcurrentHashMap<Long, Lock> userLocks = new ConcurrentHashMap<>();
public Boolean test(User user) {
Long userId = user.getUserId();
// 获取用户特定的锁,如果该用户没有锁,则创建一个新的锁
Lock userLock = userLocks.computeIfAbsent(userId, k -> new ReentrantLock());
userLock.lock();// 获取用户特定的锁
try {
//原方法
} finally {
userLock.unlock(); // 释放用户特定的锁
userLocks.remove(userId);
}
}
至于效果,额,谁知道呢,自己写个多线程测起码单用户是排队执行了