生成无重复订单号 (锁)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | package com.payboot.tool.makeno; import java.text.SimpleDateFormat; import java.util.Date; /** * @Author: 张学涛 * @Date: 2020-05-06 09:38 * @Version 1.0 为解决之前支付中心生成重复订单号的问题创建 */ public class MakeOrderNum { /** * 锁对象,可以为任意对象 */ private static Object lockObj = "lockerOrder" ; /** * 订单号生成计数器 */ private static long orderNumCount = 0L; /** * 每毫秒生成订单号数量最大值 */ private int maxPerMSECSize= 1000 ; /** * 生成非重复订单号,理论上限1毫秒1000个,可扩展 * @param tname 添加特殊前缀标识 */ public String makeOrderNum(String tname) { // 最终生成的订单号 String finOrderNum = "" ; try { synchronized (lockObj) { // 取系统当前时间作为订单号变量前半部分,精确到毫秒 long nowLong = Long.parseLong( new SimpleDateFormat( "yyyyMMddHHmmssSSS" ).format( new Date())); // 计数器到最大值归零,可扩展更大,目前1毫秒处理峰值1000个,1秒100万 if (orderNumCount >= maxPerMSECSize) { orderNumCount = 0L; } //组装订单号 String countStr=maxPerMSECSize +orderNumCount+ "" ; finOrderNum=nowLong+countStr.substring( 1 ); orderNumCount++; System.out.println(finOrderNum + "--" + Thread.currentThread().getName() + "::" + tname ); // Thread.sleep(1000); return finOrderNum; } } catch (Exception e) { e.printStackTrace(); } return finOrderNum; } } |
使用代码
1 2 | MakeOrderNum makeOrderNum= new MakeOrderNum(); String ps_orderno = makeOrderNum.makeOrderNum( "zxt" ); |
本人亲测 线程100 循环10分钟; 线程400 循环1000000次 无重复订单号。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通