Java并发编程-生成唯一序列号

本文介绍了如何在Java中进行并发编程以生成唯一的序列号。通过测试类展示了相关功能代码,并在高并发环境下表现出良好的性能。欢迎讨论和反馈。

所用到的并发编程库

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantReadWriteLock;

 

package com.league.idgenerate;

/**
 * 
 * ID生成器接口, 用于生成全局唯一的ID流水号
 * 
 * @author Ivan.Ma
 */
public interface IdGenerator {
	
	/**
	 * 生成下一个不重复的流水号
	 * @return
	 */
	String next();
	
}

 

package com.league.idgenerate;

/**
 * ID生成器的配置接口
 * @author Ivan.Ma
 */
public interface IdGeneratorConfig {
	
	/**
	 * 获取分隔符
	 * @return
	 */
	String getSplitString();
	
	/**
	 * 获取初始值
	 * @return
	 */
	int getInitial(); 
	
	/**
	 * 获取ID前缀
	 * @return
	 */
	String getPrefix();
	
	/**
	 * 获取滚动间隔, 单位: 秒
	 * @return
	 */
	int getRollingInterval();
	
}

 

package com.league.idgenerate;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantReadWriteLock;


/**
 * 默认的ID生成器, 采用前缀+时间+原子数的形式实现
 * 建议相同的配置采用同一个实例
 * @see IdGeneratorConfig
 * @author Ivan.Ma
 */
public class DefaultIdGenerator implements IdGenerator, Runnable{
	
	private String time;
	
	private AtomicInteger value;
	
	private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
	
	private IdGeneratorConfig config;
	
	private Thread thread;
	
	private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
	
	public DefaultIdGenerator(){
		config = new DefaultIdGeneratorConfig();
		time = LocalDateTime.now().format(FORMATTER);
		value = new AtomicInteger(config.getInitial());
		
		thread = new Thread(this);
		thread.setDaemon(true);
		thread.start();
	}
	
	public DefaultIdGenerator(IdGeneratorConfig config){
		this.config = config;
		time = LocalDateTime.now().format(FORMATTER);
		
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值