Java訂單號生成工具(實現一)基於物件鎖
阿新 • • 發佈:2019-02-13
-----2017-04-17更新-----
Re: claram 2017-02-04 16:15發表 [回覆]
回覆qq_27482239:line 36: 改為 >=
line 41:finOderNum 改為 finOrderNum
PS:本方法可能較為笨重,應用中高併發存在重複的可能性,可參考下一篇文章《Java訂單號生成工具(實現二)基於佇列》
-----2017-04-17更新-----
Java實現的訂單號生成工具,生成非重複訂單號,可設定每毫秒生成的訂單最大值。
用到了物件鎖。
import java.text.SimpleDateFormat; import java.util.Date; /** * @ClassName: MakeOrderNum * @CreateTime 2015年9月13日 下午4:51:02 * @author : mayi * @Description: 訂單號生成工具,生成非重複訂單號,理論上限1毫秒1000個,可擴充套件 * */ public class MakeOrderNum { /** * 鎖物件,可以為任意物件 */ private static Object lockObj = "lockerOrder"; /** * 訂單號生成計數器 */ private static long orderNumCount = 0L; /** * 每毫秒生成訂單號數量最大值 */ private int maxPerMSECSize=1000; /** * 生成非重複訂單號,理論上限1毫秒1000個,可擴充套件 * @param tname 測試用 */ public void makeOrderNum(String tname) { try { // 最終生成的訂單號 String finOrderNum = ""; 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); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { // 測試多執行緒呼叫訂單號生成工具 try { for (int i = 0; i < 200; i++) { Thread t1 = new Thread(new Runnable() { public void run() { MakeOrderNum makeOrder = new MakeOrderNum(); makeOrder.makeOrderNum("a"); } }, "at" + i); t1.start(); Thread t2 = new Thread(new Runnable() { public void run() { MakeOrderNum makeOrder = new MakeOrderNum(); makeOrder.makeOrderNum("b"); } }, "bt" + i); t2.start(); } } catch (Exception e) { e.printStackTrace(); } } }