今天在實際項目中遇到多線程同步鎖記錄一下;
第一步 新建SynchrogazerConfig.JAVA 文件
@Slf4j
@Component
public class SynchrogazerConfig {
Map<String, Object> map = new ConcurrentHashMap<>();
public void exec(String key, Runnable runnable) {
Object o = map.computeIfAbsent(key, k -> new Object());
synchronized (o) {
try {
runnable.run();
} catch (Exception e) {
log.error("新線程啟動失敗:{}", e.getMessage());
} finally {
map.remove(key);
}
}
}
}
這樣,基于ConcurrentHashMap線程安全,通過synchronized關鍵字,封裝完成。
第二步 簡單測試調用
@Autowired
private SynchrogazerConfig sync;
@ApiOperation("新增用戶")
@ApiImplicitParam(name = "userEntity", value = "新增用戶信息", dataType = "UserEntity")
@PostMApping("/save")
public AjaxResult save(UserEntity user) {
if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) {
return AjaxResult.error("用戶ID不能為空");
}
sync.exec(String.valueOf(user.getUserId()),()->{
users.put(user.getUserId(), user);
});
return AjaxResult.success();
}
問題:這樣的使用有什么問題嗎?歡迎評論區交流學習!