From e2dd80eec7df85a422d11338ca9dfdb869782a79 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Wed, 24 Jun 2026 21:27:50 +0800
Subject: [PATCH] fix(grid): 修复网格元素索引并发访问问题
---
src/main/java/com/xcong/excoin/modules/gateApi/GridElement.java | 36 +++++++++++++++++++++++-------------
1 files changed, 23 insertions(+), 13 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/gateApi/GridElement.java b/src/main/java/com/xcong/excoin/modules/gateApi/GridElement.java
index dbcfe19..661cdd2 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GridElement.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GridElement.java
@@ -92,6 +92,9 @@
/** 空仓止损订单 ID */
private String shortStopLossOrderId;
+ /** 索引重建锁,保证 refreshIndices() 与计数读取之间互斥,避免 clear→rebuild 窗口期读到 0 */
+ private static final Object INDEX_LOCK = new Object();
+
/** 全局 ID 索引,由 {@link GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
private static final Map<Integer, GridElement> INDEX = new ConcurrentHashMap<>();
/** 全局价格索引,由 {@link GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
@@ -169,11 +172,15 @@
return SHORT_TP_ORDER_ID_INDEX.get(orderId);
}
- /** @return 当前多仓止盈单数量 */
- public static int getLongTakeProfitCount() { return LONG_TP_ORDER_ID_INDEX.size(); }
+ /** @return 当前多仓止盈单数量(与 refreshIndices 互斥,避免清空窗口读到 0) */
+ public static int getLongTakeProfitCount() {
+ synchronized (INDEX_LOCK) { return LONG_TP_ORDER_ID_INDEX.size(); }
+ }
- /** @return 当前空仓止盈单数量 */
- public static int getShortTakeProfitCount() { return SHORT_TP_ORDER_ID_INDEX.size(); }
+ /** @return 当前空仓止盈单数量(与 refreshIndices 互斥,避免清空窗口读到 0) */
+ public static int getShortTakeProfitCount() {
+ synchronized (INDEX_LOCK) { return SHORT_TP_ORDER_ID_INDEX.size(); }
+ }
/**
* 根据多仓止损订单 ID 快速查找网格元素(O(1))。
@@ -216,16 +223,19 @@
* 使快速查找方法获取到最新数据。
*/
public static void refreshIndices() {
- PRICE_INDEX.clear();
- LONG_ORDER_ID_INDEX.clear();
- SHORT_ORDER_ID_INDEX.clear();
- LONG_TP_ORDER_ID_INDEX.clear();
- SHORT_TP_ORDER_ID_INDEX.clear();
- LONG_SL_ORDER_ID_INDEX.clear();
- SHORT_SL_ORDER_ID_INDEX.clear();
- for (GridElement e : INDEX.values()) {
- putDynamicIndices(e);
+ synchronized (INDEX_LOCK) {
+ PRICE_INDEX.clear();
+ LONG_ORDER_ID_INDEX.clear();
+ SHORT_ORDER_ID_INDEX.clear();
+ LONG_TP_ORDER_ID_INDEX.clear();
+ SHORT_TP_ORDER_ID_INDEX.clear();
+ LONG_SL_ORDER_ID_INDEX.clear();
+ SHORT_SL_ORDER_ID_INDEX.clear();
+ for (GridElement e : INDEX.values()) {
+ putDynamicIndices(e);
+ }
}
+ // logAll 在锁外执行,不阻塞计数查询
logAll();
}
--
Gitblit v1.9.1