** 方案一: **
如果没有并发的话,订单号只在一个线程中产生,不同订单的时间戳不同,时间戳+随机数(自增数)区分订单。
如果有并发的话,并且订单号在同一台主机产生多个进程,只要把进程的ID添加到序列号中就可以保证订单号唯一。
如果有并发且订单在不同主机中,把IP地址 CPU序列号 能区分的号码添加到序列号中就能保证唯一。

** 方案二: **
时间戳+用户ID+随机数+乐观锁

** 方案三: **
可以用redis的原子递增,做高可用集群

** 方案四: **
java自带的UUID(不推荐)

** 实例代码: **
java中获取线程ID:

Thread.currentThread().getId();

java获取进程ID:

RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
Field jvm = runtime.getClass().getDeclaredField("jvm");
jvm.setAccessible(true);
VMManagement mgmt = (VMManagement)jvm.get(runtime);
Method pidMethod = mgmt.getClass().getDeclaredMethod("getProcessId");
pidMethod.setAccessible(true);
int pid = (Integer)pidMethod.invoke(mgmt);

java获取mac地址:

InetAddress ia = InetAddress.getLocalHost();
byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress();
String macStr = DatatypeConverter.printHexBinary(mac);