Java订单号生成工具(实现一)基于对象锁

来源:互联网 发布:学校网络环境建设 编辑:程序博客网 时间:2024/05/13 05:02

-----2017-04-17更新-----

[html] view plain copy
  1. Re: claram 2017-02-04 16:15发表 [回复]  
  2.   
  3. 回复qq_27482239:line 36: 改为 >=  
  4. line 41:finOderNum 改为 finOrderNum  

感谢  claram  指正

PS:本方法可能较为笨重,应用中高并发存在重复的可能性,可参考下一篇文章《Java订单号生成工具(实现二)基于队列

-----2017-04-17更新-----

Java实现的订单号生成工具,生成非重复订单号,可设置每毫秒生成的订单最大值。

用到了对象锁。


[java] view plain copy
  1. import java.text.SimpleDateFormat;  
  2. import java.util.Date;  
  3.   
  4. /** 
  5.  * @ClassName: MakeOrderNum 
  6.  * @CreateTime 2015年9月13日 下午4:51:02 
  7.  * @author : mayi 
  8.  * @Description: 订单号生成工具,生成非重复订单号,理论上限1毫秒1000个,可扩展 
  9.  * 
  10.  */  
  11. public class MakeOrderNum {  
  12.     /** 
  13.      * 锁对象,可以为任意对象 
  14.      */  
  15.     private static Object lockObj = "lockerOrder";  
  16.     /** 
  17.      * 订单号生成计数器 
  18.      */  
  19.     private static long orderNumCount = 0L;  
  20.     /** 
  21.      * 每毫秒生成订单号数量最大值 
  22.      */  
  23.     private int maxPerMSECSize=1000;  
  24.     /** 
  25.      * 生成非重复订单号,理论上限1毫秒1000个,可扩展 
  26.      * @param tname 测试用 
  27.      */  
  28.     public void makeOrderNum(String tname) {  
  29.         try {  
  30.             // 最终生成的订单号  
  31.             String finOrderNum = "";  
  32.             synchronized (lockObj) {  
  33.                 // 取系统当前时间作为订单号变量前半部分,精确到毫秒  
  34.                 long nowLong = Long.parseLong(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()));  
  35.                 // 计数器到最大值归零,可扩展更大,目前1毫秒处理峰值1000个,1秒100万  
  36.                 if (orderNumCount >= maxPerMSECSize) {  
  37.                     orderNumCount = 0L;  
  38.                 }  
  39.                 //组装订单号  
  40.                 String countStr=maxPerMSECSize +orderNumCount+"";  
  41.                 finOrderNum=nowLong+countStr.substring(1);  
  42.                 orderNumCount++;  
  43.                 System.out.println(finOrderNum + "--" + Thread.currentThread().getName() + "::" + tname );  
  44.                 // Thread.sleep(1000);  
  45.             }  
  46.         } catch (Exception e) {  
  47.             e.printStackTrace();  
  48.         }  
  49.     }  
  50.   
  51.     public static void main(String[] args) {  
  52.         // 测试多线程调用订单号生成工具  
  53.         try {  
  54.             for (int i = 0; i < 200; i++) {  
  55.                 Thread t1 = new Thread(new Runnable() {  
  56.                     public void run() {  
  57.                         MakeOrderNum makeOrder = new MakeOrderNum();  
  58.                         makeOrder.makeOrderNum("a");  
  59.                     }  
  60.                 }, "at" + i);  
  61.                 t1.start();  
  62.   
  63.                 Thread t2 = new Thread(new Runnable() {  
  64.                     public void run() {  
  65.                         MakeOrderNum makeOrder = new MakeOrderNum();  
  66.                         makeOrder.makeOrderNum("b");  
  67.                     }  
  68.                 }, "bt" + i);  
  69.                 t2.start();  
  70.             }  
  71.         } catch (Exception e) {  
  72.             e.printStackTrace();  
  73.         }  
  74.   
  75.     }  
  76.   
  77. }  
0 0
原创粉丝点击