利用时间获取订单号

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位,这样可能三个多月就会出现重复,不过依然可以满足项目需求。


posted on 2011-11-10 17:25  elm  阅读(849)  评论(0编辑  收藏  举报

导航