本人小白,希望大家指导指导!
直接上代码
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);
}
}
}
![](https://img.haomeiwen.com/i8953654/580a524c6de73508.png)
这里用到了同步锁,为什么锁放在方法内部呢?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有自动转型的功能。一个字符串与一个别的类型拼接 结果都会是字符串。
其实很简单,用时间+自定义的变量拼接,这里主要考虑的是锁的设计,希望有好的方法的大神指导指导。由于第一次写简书,写的不是很好,希望各位指导。错的地方指出来 。
网友评论