java代码生成订单号(转)

本人小白,希望大家指导指导!

直接上代码

package com.xy.ddh;

import java.text.SimpleDateFormat;

import java.util.Date;

public class Ordernumber extends Thread {

private static String date;

private static Long on =00l;

public static  String getOrderNo() {

synchronized (Ordernumber.class){

String str = new SimpleDateFormat("yyMMddHHmm").format(new Date()); //当前时间

if (date == null || !date.equals(str)) { //判断date

date = str;

on = 00l; //(这里是l)不是数字的1,因为是long类型

}

on++;

long orderNo = Long.parseLong(date)*1000; //将字符串转化为Long类型

orderNo += on;  //订单其实号

return "SY" + orderNo; //拼接订单号 SY是公司名称

}

}

public static void main(String[] args) throws InterruptedException {

for(int i=0;i<10;i++){

System.out.println(Ordernumber.getOrderNo());

//Thread.sleep(2000);

}

}

}

java代码生成订单号(转)_第1张图片

这里用到了同步锁,为什么锁放在方法内部呢?synchronized(Sync.class)实现了全局锁的效果。锁住的是class,也是对象,所以这样子能实现全局锁的效果,对于public static synchronized String getOrderNo() {} 其实这样子的锁是不安全的,看起来锁住了方法,当时多个线程运行的时候,还是能够得到这个锁的。而且用户等待的时间很长,具体可以看http://blog.csdn.net/xiao__gui/article/details/8188833。

Long on =00l; 从0开始,那么别人提问可以从别2或者3或者其他数字开始吗 答案是可以的,因为从0开始,当if语句走出来后会对on+1,这样就订单号是最后一位是从0+1=1开始。

return "SY" + orderNo; //拼接订单号 SY是公司名称 这里对单号拼接,因为返回的是String 所以如果不需要加公司号的话,可以去掉SY 直接就+“”;

因为java有自动转型的功能。一个字符串与一个别的类型拼接 结果都会是字符串。

其实很简单,用时间+自定义的变量拼接,这里主要考虑的是锁的设计,希望有好的方法的大神指导指导。由于第一次写,写的不是很好,希望各位指导。错的地方指出来 。

你可能感兴趣的:(java代码生成订单号(转))