自增序列

                                          自增序列


需求,并发情况下


1 、System.currentTimeMillis(); 获取时间戳, 到秒是倒数第四位。
2、取后四位,然后同秒就按之前取的seq递增,不同秒就按新取的

缺点:可能会有情况,同秒的请求数超过三位数,递增的话也会超过三位数,有点懵了。
比如   2200,  然后递增到3050以上是完全有可能的
那下一秒后,开始取了个3010,这样就跟之前的重复了。(GGGGGGGG)

垃圾代码如下,求改良:

import java.util.concurrent.atomic.AtomicLong;

public class SeqUtil {
    private Long lastTime=-1L;
    private AtomicLong addNubmer = new AtomicLong(0);
    private volatile static SeqUtil uniqueInstance = null;
    public static SeqUtil getUniqueInstance() {
        if (null == uniqueInstance) {
            synchronized (SeqUtil.class) {
                if (null == uniqueInstance) {
                    uniqueInstance = new SeqUtil();
                }
            }
        }
        return uniqueInstance;
    }
    public String getSeq()
    {
        Long currentTime=System.currentTimeMillis();
        String str;
        if((currentTime/1000) == (lastTime/1000))
        {
            str = addNubmer.toString();
            addNubmer.addAndGet(1);
            String seq = str.substring(str.length() - 4, str.length());
            return seq;
        }
        else {
            lastTime = currentTime;
            synchronized (SeqUtil.class) {
                addNubmer = new AtomicLong(lastTime + 1);
            }
            String s=currentTime.toString();
            return s.substring(s.length()-4,s.length());
        }
    }

    public static void main(String[] args) {
        int i=0;
        while (i<100) {
            i++;
            if(i == 50) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(SeqUtil.getUniqueInstance().getSeq());
        }

    }
}

运行结果:

5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228

Process finished with exit code 0

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值