利用时间获取订单号

本文介绍了一种在多线程环境下确保唯一订单号生成的方法,通过使用`synchronized`关键字和`Thread.sleep()`函数,实现了在一定时间段内(约三年)订单号不重复的机制。此外,文章还探讨了在集群环境中可能遇到的问题,并提出了通过设置每台机器生成定单号的最高位不同的解决方案。最后,提供了一个示例代码来验证方法的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 定单号,要求很GX,10位以内的数字,不可重复,本想在mysql中,弄个字段自增,其实这样也可,但如果有并发,要操作数据库,就不太合适了。

2. 用代码实现,要求在有并发的情况下,也能保证10位定单号不重复,这个办法只能保证在一定的时间段内不重复,大概是三年。

OdnTool
 1 public class OdnTool {
2
3 public static synchronized String getOdn() throws Exception {
4 Thread.sleep(1);
5 String ut = String.valueOf(System.currentTimeMillis());
6 String odn = ut.substring(ut.length() - 10, ut.length());
7 System.out.println(odn);
8 return odn;
9 }
10 }

 synchronized和Thread.sleep(1) 都必不可少。

3. 测试代码

OdnTest
 1 public class OdnTest extends Thread {
2 public OdnTest(String name) {
3 super(name);
4 }
5
6 public void run() {
7 try {
8 OdnTool.getOdn();
9 } catch (Exception e) {
10 e.printStackTrace();
11 }
12 }
13
14 public static void main(String[] args) {
15 for (int i = 0; i < 1000; i++) {
16 new OdnTest(String.valueOf(i)).start();
17 }
18 }
19 }

在多线程环境中,如果缺少synchronized,会导致生成的定单号重复,因为几个线程一起执行,都睡眠1ms,再获取的时间会相同(java只能精确到毫秒);如果缺少Thread.sleep(1),线程是同步了,但两个同步的线程会在很短的时间内执行OK,获取的时间也会相同。

4. 不过,如果是在集群环境中,会出现两台机产生的定单号重复。其实可以这样,设定每台机生成定单号的最高位不同,但这样就只能截取时间的后9位,这样可能三个多月就会出现重复,不过依然可以满足项目需求。


转载于:https://www.cnblogs.com/elm5280/archive/2011/11/10/2244717.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值