package com.rongchang.ziling.game.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 高并发情况下获取订单号
*
* @author liuhongbing
*
*/
public final class OrderUtil {
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
private static final AtomicInteger atomicInteger = new AtomicInteger(1000000);
/**
* 创建不连续的订单号
*
* @param no 数据中心编号
* @return 唯一的、不连续订单号
*/
public static synchronized String getOrderNoByUUID(String no) {
Integer uuidHashCode = UUID.randomUUID().toString().hashCode();
if (uuidHashCode < 0) {
uuidHashCode = uuidHashCode * (-1);
}
String date = simpleDateFormat.format(new Date());
return no + date + uuidHashCode;
}
/**
* 获取同一秒钟 生成的订单号连续
*
* @param no 数据中心编号
* @return 同一秒内订单连续的编号
*/
public static synchronized String getOrderNoByAtomic(String no) {
atomicInteger.getAndIncrement();
int i = atomicInteger.get();
String date = simpleDateFormat.format(new Date());
return no + date + i;
}
public static void main(String[] args) {
// 测试多线程调用订单号生成工具
try {
for (int i = 0; i < 200; i++) {
Thread t1 = new Thread(new Runnable() {
public void run() {
String aa=OrderUtil.getOrderNoByUUID("");
System.out.println(aa);
}
}, "at" + i);
t1.start();
Thread t2 = new Thread(new Runnable() {
public void run() {
String aa=OrderUtil.getOrderNoByUUID("");
System.out.println(aa);
}
}, "bt" + i);
t2.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
创建唯一订单号,真的不重复 JMeter 亲测
最新推荐文章于 2024-07-22 12:45:41 发布
本文介绍了一种在高并发环境下生成唯一订单号的方法,包括使用UUID和原子整数实现的两种不同策略,确保了订单号的唯一性和连续性。
1595

被折叠的 条评论
为什么被折叠?



