From 7487bb18f183584fe20632d883a67963db2b1a3d Mon Sep 17 00:00:00 2001 From: zengtao01 Date: Fri, 15 Nov 2024 10:21:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B6=85=E5=B8=82=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../storeorder/AppStoreOrderController.java | 23 ++++++++++--------- .../member/service/amount/LockManager.java | 7 ++++++ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/storeorder/AppStoreOrderController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/storeorder/AppStoreOrderController.java index 7a98913c..c057aa39 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/storeorder/AppStoreOrderController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/storeorder/AppStoreOrderController.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.module.member.service.amount.LockManager.getStoreOrderLock; @Tag(name = "APP超市 - 商品订单") @RestController @@ -66,13 +67,13 @@ public class AppStoreOrderController { @PostMapping("/appCreate") @Operation(summary = "购物车订单") - public synchronized CommonResult appCreate(@RequestBody CardDto dto) { - - - AddReqVO addReqVO = storeOrderService.appCreate(dto); - //记录 - memberAsyncService.batchRecord(addReqVO); + public CommonResult appCreate(@RequestBody CardDto dto) { + synchronized(getStoreOrderLock("create")){ + AddReqVO addReqVO = storeOrderService.appCreate(dto); + //记录 + memberAsyncService.batchRecord(addReqVO); + } return success(true); } @@ -97,11 +98,11 @@ public class AppStoreOrderController { @GetMapping("/cancel") @Operation(summary = "取消订单") public synchronized CommonResult cancel(Integer orderId) { - - AddReqVO cancel = storeOrderService.cancel(orderId); - //记录 - memberAsyncService.batchRecord(cancel); - + synchronized(getStoreOrderLock("cancel")){ + AddReqVO cancel = storeOrderService.cancel(orderId); + //记录 + memberAsyncService.batchRecord(cancel); + } return success(true); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/LockManager.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/LockManager.java index 6d343727..b6990947 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/LockManager.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/LockManager.java @@ -10,6 +10,8 @@ public class LockManager { private static final ConcurrentHashMap supermarketLocks = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap storeOrderLock = new ConcurrentHashMap<>(); + public static Object getUserLock(Long userId) { // 从 Map 中获取 WeakReference 对象 return userLocks.computeIfAbsent(userId, k -> new Object()); @@ -24,5 +26,10 @@ public class LockManager { // 对每个 userId 生成独立的锁对象,并发地存储在 ConcurrentHashMap 中 return supermarketLocks.computeIfAbsent(storeId, k -> new Object()); } + + public static Object getStoreOrderLock(String key) { + // 对每个 userId 生成独立的锁对象,并发地存储在 ConcurrentHashMap 中 + return storeOrderLock.computeIfAbsent(key, k -> new Object()); + } }