From 94bc595757fca0aca349db1a0ba295e92f6ece5f Mon Sep 17 00:00:00 2001 From: imhao183 Date: Wed, 28 Oct 2020 10:39:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E9=83=A8=E5=88=86=E6=83=85?= =?UTF-8?q?=E5=86=B5=E4=B8=8B=E6=B6=88=E6=81=AFid=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../win/liyufan/im/MessageShardingUtil.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/broker/src/main/java/win/liyufan/im/MessageShardingUtil.java b/broker/src/main/java/win/liyufan/im/MessageShardingUtil.java index 1b8f04a3..3ed89528 100644 --- a/broker/src/main/java/win/liyufan/im/MessageShardingUtil.java +++ b/broker/src/main/java/win/liyufan/im/MessageShardingUtil.java @@ -10,6 +10,7 @@ package win.liyufan.im; import java.util.Calendar; import java.util.Date; +import java.util.concurrent.ConcurrentHashMap; public class MessageShardingUtil { private static SpinLock mLock = new SpinLock(); @@ -36,9 +37,8 @@ public class MessageShardingUtil { */ public static long generateId() throws Exception { mLock.lock(); - rotateId = (rotateId + 1)&rotateIdMask; - mLock.unLock(); + rotateId = (rotateId + 1)&rotateIdMask; long id = System.currentTimeMillis() - T201801010000; if (id > timeId) { @@ -75,6 +75,10 @@ public class MessageShardingUtil { id <<= rotateIdWidth; id += rotateId; + + mLock.unLock(); + + return id; } @@ -127,4 +131,27 @@ public class MessageShardingUtil { return "t_messages_" + (year * 12 + month); } + + public static void main(String[] args) throws Exception { + ConcurrentHashMap messageIds = new ConcurrentHashMap<>(); + + int threadCount = 1000; + int loop = 1000000; + for (int i = 0; i < threadCount; i++) { + new Thread(()->{ + for (int j = 0; j < loop; j++) { + try { + long mid = generateId(); + if(messageIds.put(mid, j) != null) { + System.out.println("Duplicated message id !!!!!!" + mid); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + }).start(); + } + + Thread.sleep(1000 * 60 * 10); + } }