单实例环境,不是分布式
需要流水号
/**
* 流水号生成器
*
* 年+天号+毫秒+随机数
* 2019+134+480+11位随机数
* 4+3+3+11 = 21位
*
*
* @author sxd
* @date 2019/5/14 9:55
*/
public class SerialCreater {
public static final String SERIAL_FROMAT = "%s%s%s%s";
private String serialNum;
public SerialCreater() {
this.serialNum = String.format(
SERIAL_FROMAT,
DateUtil.thisYear(),
Calendar.getInstance().get(Calendar.DAY_OF_YEAR),
DateUtil.thisMillsecond(),
random());
}
public static String getSerial(){
return new SerialCreater().serialNum;
}
private String random(){
Long a = new Random().nextLong();
Long b = DateUtil.current(false);
Long c = (a-b)>>>16;
return autoGenericCode(c);
}
private String autoGenericCode(Long old){
String result = old.toString();
int length = result.length();
if (length > 11){
result = result.substring(0,11);
}else if (length < 11){
result = String.format("%011d", old);
}
return result;
}
}
View Code
调用:
System.out.println(SerialCreater.getSerial());
测试生成100W,查看是否重复:
public static void main(String[] args) {
Set
System.out.println(set.size());
int a = 1000000;
for (int i = 0; i < a; i++) {
set.add(SerialCreater.getSerial());
}
System.out.println(set.size());
}
View Code
并发100W,100W个线程测试是否重复:
/**
* @author sxd
* @date 2019/5/14 13:35
*/
public class RUnTest {
static final ConcurrentHashMap
public static void main(String[] args) {
System.out.println(concurrentHashMap.size());
int a = 1000000;
for (int i = 0; i < a; i++) {
MyThread my = new MyThread();
my.run();
}
System.out.println(concurrentHashMap.size());
}
static class MyThread implements Runnable{
@Override
public void run() {
concurrentHashMap.put(SerialCreater.getSerial(),1);
}
}
}
View Code
发表评论