1. 程式人生 > >Java並發生成不重復訂單流水號

Java並發生成不重復訂單流水號

sta .text format util inner final uuid 主鍵 tostring

最近做一個訂單模塊要生成訂單號,因為考慮到用Mysql主鍵做訂單號在以後分庫分表後會重復,就想到自己創建。

這裏要涉及到並發操作,所以要麽就用單例內部類,或者就是加鎖,因為時間關系我先實現了內部類和鎖,後續再用類把String替換了。

具體代碼:

package com.jzg.svsp.order.utils;

import javax.validation.constraints.NotNull;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

/** * @author: YuGenHai * @name: AbstractOrderSequenceRandom * @creation: 2018/9/21 16:57 * @notes: svsp + yyyyMMdd + uuid /random * @notes: 生成訂單號工具類 */ public abstract class AbstractOrderSequenceRandom { /** * 訂單前綴 */ private static final String ORDERPREFIX = "SVSP";
/** * 時間戳 */ private static final String FORMAT = "yyyyMMddHHmmss"; /** * 數字隨機 */ public static final String numberChar = "0123456789"; /** * 隨機數字 */ public static final int numberFor = 5; /** * @return * @author yugenhai
*/ @NotNull public synchronized static String createOrderSnRandom() { return AbstractOrderSequenceRandomInner.createOrderSnRandomInner(); } /** * 創建訂單號<svsp + yyyy-mm-dd + Random> * * @author yugenhai */ private final static class AbstractOrderSequenceRandomInner { private synchronized static String createOrderSnRandomInner() { SimpleDateFormat sdf = new SimpleDateFormat(FORMAT); StringBuffer sb = new StringBuffer(); Random random = new Random(); for (int i = 0; i < numberFor; i++) { sb.append(numberChar.charAt(random.nextInt(numberChar.length()))); } return ORDERPREFIX + sdf.format(new Date()) + sb.toString(); } } }

之前沒加鎖時候如果在幾個線程池裏放了幾百個線程同時生成的情況下是有極小的幾率會重復,因為還沒有做成單例類返回原因,加了鎖初步可以上線,後續在調整。

Java並發生成不重復訂單流水號