博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
唯一序列号生成,自測支持高并发,不支持集群
阅读量:6709 次
发布时间:2019-06-25

本文共 2236 字,大约阅读时间需要 7 分钟。

序列号组成:前缀 + 日期 + 尾数 

比如: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
尽管在生成器方法没有加同步关键词,是由于尾数自增是原子操作。

測试类:

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次訪问,測试结果没有发生反复。

转载地址:http://wyalo.baihongyu.com/

你可能感兴趣的文章
443 Chapter8. Failover clustering -- not completed
查看>>
TestLink1.6.0安装说明(转载)
查看>>
MVC验证01-基础、远程验证
查看>>
SSL与TLS 区别 以及介绍
查看>>
微信公众平台——验证消息真实性
查看>>
来把狠的——传一个肖邦的《Black Key Exercise(黑键练习曲)》
查看>>
C# 实现类似 QQ 的窗体停靠
查看>>
[毕业生的商业软件开发之路]开发第一个Windows应用程序
查看>>
浮动的客户联系样式QQ模块层兼容各浏览器
查看>>
Javascript在ASP.NET中的用法:计算还剩余输入多少个字符
查看>>
5. Quad
查看>>
线程的取消/撤销 (转)
查看>>
Mongodb数据库入门之Spring Mongodb
查看>>
ActiveX组件与JavaScript交互
查看>>
2013第52周六当前用到的一些软件及网站
查看>>
DrawDibDraw函数的使用方法
查看>>
两种将字符串转换成浮点数的方法
查看>>
Xcode 调试技巧-b
查看>>
几种常见SQL分页方式效率比较
查看>>
socket中的SO_REUSEADDR
查看>>