`

以秒为单位生成唯一的时间序列号

    博客分类:
  • java
阅读更多
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 功能: 以秒为单位生成唯一的序列号 <br/>
 * 生成格式:YYMMddHHmmssXXXXXXX <br/>
 * XXXXXXX:代表序列号,从1开始
 * 例子: 1808312321280000001 或者 1808312321280001234 <br/>
 * <p>局限性: 每秒生成最大范围 (1000万-1) 个数</p>
 * Created by Administrator on 2018/8/31.
 */
public final class GenerateDateTimeUniqueID {

//    private static final DateFormat DF = new SimpleDateFormat("yyMMddHHmmss");
    private static final ThreadLocal<DateFormat> DATE_FORMAT_THREAD_LOCAL = new ThreadLocal<DateFormat>(){
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyMMddHHmmss");
        }
    };
    private static volatile long LAST_TIME = -1;
    private static final AtomicInteger COUNT = new AtomicInteger();

    //测试是否有生成重复的ID
    public static final ConcurrentMap<String, Boolean> MAP = new ConcurrentHashMap<String, Boolean>();

    /*******
     *
     * 测试机器系统参数: Win7 64位 i5-4210M 4core 2.6GHz 内存8GB
     *
     * ********/

    /**
     * 测试10个线程并发产生,每秒可以产生500万左右个序列号
     * *
     */
    public static long generateDateTimeUniqueId() {
        Date date = new Date();
        String dateStr = DATE_FORMAT_THREAD_LOCAL.get().format(date);
//        String dateStr = DF.format(date);
        long curTime = Long.parseLong(dateStr);
        int curCount = 0;

        synchronized (GenerateDateTimeUniqueID.class) {
            if (curTime < LAST_TIME) {
                curTime = LAST_TIME;
            } else if (curTime > LAST_TIME) {
                LAST_TIME = curTime;
                System.out.println(Thread.currentThread().getName() + "-" + COUNT.get());
                COUNT.set(0);
            }
            curCount = COUNT.incrementAndGet();
        }

        return curTime * 10000000 + curCount;
    }

    private GenerateDateTimeUniqueID() {
    }

    public static void main(String[] args) {

        //测试
        int num = 10;
        ExecutorService executorService = Executors.newFixedThreadPool(num);
        for (int i = 0; i < num; i++) {
            executorService.submit(new TestThread());
        }
    }

    static class TestThread implements Runnable {

        @Override
        public void run() {
            while (true) {
                try {
                    generateDateTimeUniqueId();
//                    System.out.println(generateDateTimeUniqueId());
                } catch (Exception e) {
                    e.printStackTrace();
                    System.exit(0);
                }

            }
        }
    }
}

 

0
0
分享到:
评论
2 楼 angeltping 2018-09-03  
angeltping 写道
SimpleDateFormat
这个是线程不安全的同学!

实现方式也不好!
1 楼 angeltping 2018-09-03  
SimpleDateFormat
这个是线程不安全的同学!

相关推荐

    利用时间生成8位不重复数

    1. 获取当前系统时间的时间戳,通常以秒为单位。 2. 将时间戳转换为十六进制。由于时间戳通常是较大的整数,转换后的十六进制字符串可能会超过8位,因此可能需要对这个字符串进行截取,只保留前8位,确保其长度满足...

    C#实现 用时间做序号

    在IT领域,特别是软件开发过程中,常常需要生成唯一的标识符或序列号来追踪记录或确保数据的唯一性。其中一种常见的方法是利用当前系统时间作为序列号的一部分,这种方法简单且易于实现。本文将深入探讨如何在C#中...

    EXCEL函数公式学习大全.doc

    - `TIMEVALUE`:将文本时间转换为序列号。 - `TODAY`:返回当前日期的序列号。 - `WEEKDAY`:将序列号转换为星期几。 - `WORKDAY`:返回指定工作日数前或后某日期的序列号。 - `YEAR`:从序列号中提取年份。 3...

    excel 函数大全

    - `SECOND`:将序列号转换为秒。 - `TIME`:生成特定时间的序列号。 - `TIMEVALUE`:将时间文本转换为序列号。 - `TODAY`:返回当前日期的序列号。 - `WEEKDAY`:将序列号转换为星期几。 - `WORKDAY`:返回...

    MongoDB的ObjectId.pdf

    1. **时间戳(4 个字节)**:这四个字节代表了文档创建的时间,以秒为单位自 Unix 纪元(1970 年 1 月 1 日)以来的时间。这样,ObjectId 自然地按照创建顺序排序,这对于跟踪和查询数据非常有用。 2. **机器标识码...

    access数据类型大全

    Access中的日期格式通常为“年-月-日”,而时间格式则为“时:分:秒”。 #### 5. 货币 (Currency) 货币字段专门用于存储货币值。它采用64位整数表示法,能够精确到万分之一单位。货币字段非常适合用来处理财务数据...

    4444444444444444444

    在IT系统中,通常会精确到小时、分钟甚至秒,以便于更准确地进行事件排序和异常检测。 - **技术实现**:大多数现代数据库系统支持精确的时间戳记录,并提供了丰富的工具和技术来处理日期和时间数据。例如,SQL提供了...

    6种php上传图片重命名的方法实例

    - **缺点**:在高并发场景下,以秒为单位的时间戳可能会导致重复。 - **用法**:通过`uniqid()`函数,可添加前缀并设置`more_entropy`参数为`true`提高唯一性。 4. **fast_uuid** - **优点**:生成17位数字,较...

    无线TRACE 速查表

    2. **ttime**: 事件发生的时间戳,以秒为单位,精确到小数点后6位。 3. **HsHop**: 源节点ID,标识发送数据包的节点。 4. **HdHop**: 目标节点ID,接收数据包的节点。 5. **NiNode ID**: 当前处理事件的节点ID,可能...

    Oracle9i的init.ora参数中文说明

    说明: 指定用于将生成的 C 文件编译为目标文件的 C 编译程序的完整路径名。此参数是可选的。随每个平台附带的特有的 make 文件中包含此参数的默认值。如果为此参数指定了一个值, 则该值将覆盖 make 文件中的默认值...

    OSPF几类LSA总结

    - **LS age**:LSA产生后所经过的时间,以秒为单位。 - **Options**:可选项,例如是否允许泛洪AS-External-LSA等。 #### 示例分析 假设存在如下网络拓扑结构: - **RTA**、**RTB**、**RTC**、**RTD** 和 **RTE**...

    计算机英语术语大全.pdf

    CLK(时钟周期):CPU执行每条指令需要的最小时间单位。 COB(板载缓存):指在主板上直接集成的缓存。 COD(芯片上缓存):指在CPU芯片内部直接集成的缓存。 CPGA(芯片级引脚栅格阵列):一种封装类型,芯片...

    计算机英文术语完全介绍

    处理器序列号,是用于唯一标识处理器的数字或字母组合,常用于设备认证和跟踪。 ### PIB (Processor In a Box) 盒装处理器,指带有散热器和风扇的完整处理器套件,便于用户安装和使用。 ### PPGA (Plastic Pin ...

    计算机英语术语大全(word文档)

    - **AGU (Address Generation Units, 地址生成单元)**:负责生成内存访问所需的地址,对于提高数据读取效率至关重要。 - **BGA (Ball Grid Array, 球状矩阵排列)**:一种集成电路封装技术,采用球形触点作为其连接...

    计算机术语大全(中英对照)

    **定义:** 时钟周期是CPU运行的基础时间单位,指时钟信号从高到低或从低到高的变化周期。它是衡量CPU运行速度的重要指标之一。 #### 11. COB (板上集成缓存) **中文名称:** 板上集成缓存 **英文全称:** Cache On ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体...

    海康视频卡动态库

    /// 序列号 /// BYTE sn[16]; /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] byte[] sn; /// /// 板卡包含的DSP个数 /// uint dspCount; /// /// 板卡上第一个DSP的索引 /// uint ...

Global site tag (gtag.js) - Google Analytics