所用到的并发编程库
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);

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





