唯一序列號生成,自測支持高並發,不支持集群
阿新 • • 發佈:2017-07-25
n) 發生 for ase 數字 led efi date() trac
枚舉類是為了控制參數保證統一性。
盡管在生成器方法沒有加同步關鍵詞,是由於尾數自增是原子操作。
開了20個線程並發2000次訪問,測試結果沒有發生反復。
序列號組成:前綴 + 日期 + 尾數
比如:ZC20140806000001
總共兩個組成:一個枚舉類。一個靜態生成器。另外須要設計自己主動任務每日淩晨或其它時間重置一次尾數。
先上枚舉類:
package com.boxmeal.base.constant.common; import java.util.concurrent.atomic.AtomicInteger; /** * 序列號生成枚舉 * @author bling * */ public enum SNEnum { // 訂單編號 SUIT("tcd",new AtomicInteger(0)); private String prefix; private AtomicInteger count; private SNEnum(String prefix,AtomicInteger count) { this.prefix = prefix; this.count = count; } public void setPrefix(String prefix) { this.prefix = prefix; } public void setCount(AtomicInteger count) { this.count = count; } public String getPrefix() { return prefix; } public AtomicInteger getCount() { return count; } }
再上生成器類:
package com.boxmeal.base.util; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.atomic.AtomicInteger; import com.boxmeal.base.constant.common.SNEnum; /** * 序列號生成器,每日自己主動從1開始增長 * @author bling * */ public class SNGenerater { /** * 日期格式化 */ private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); /** * 數字格式化 */ private static final DecimalFormat decimalFormat = new DecimalFormat("000000"); /** * 序列號產生器 * @param sn * @return */ public final static String genSuitSN(SNEnum sn){ String prefix = sn.getPrefix(); String dateStr = SNGenerater.dateFormat.format(new Date()); String suffix = SNGenerater.decimalFormat.format(sn.getCount().incrementAndGet()); return prefix + dateStr + suffix; } /** * 重置序列號生成器:自己主動任務每日夜間00:00調用一次 */ public final static void reset(){ SNEnum[] snEnumAry = SNEnum.values(); for(int i=0;i<snEnumAry.length;i++){ snEnumAry[i].setCount(new AtomicInteger(0)); } } public static void main(String[] args) { for(int i=0;i<100;i++){ System.out.println(SNGenerater.genSuitSN(SNEnum.SUIT)); } SNGenerater.reset(); for(int i=0;i<100;i++){ System.out.println(SNGenerater.genSuitSN(SNEnum.SUIT)); } } }
盡管在生成器方法沒有加同步關鍵詞,是由於尾數自增是原子操作。
測試類:
package com.boxmeal.test; import com.boxmeal.base.constant.common.SNEnum; import com.boxmeal.base.util.SNGenerater; public class SNTest { class VisitThread implements Runnable{ @Override public void run() { for(int i=0;i<100;i++){ System.out.println(SNGenerater.genSuitSN(SNEnum.SUIT)); try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } } } } public void test(){ for(int i=0;i<20;i++){ new Thread(new VisitThread()).start(); } } public static void main(String[] args) { new SNTest().test(); } }
開了20個線程並發2000次訪問,測試結果沒有發生反復。
唯一序列號生成,自測支持高並發,不支持集群