我有一个在多线程环境中使用的 hi-lo Id 生成器。每个线程每秒最多可以调用 100k 次生成器
我有一个相当好的(和安全的)实现,效果很好。IdAllocator 是获取下一批“id”的对象。您可以假设这是线程安全的。我还将 batchSize 设置得很高(100 万)
private final IdAllocator idAllocator;
private final String idKey;
private final int batchSize;
private final Object lock = new Object();
private long currentId = 0;
private long nextFetchId = -1;
IdGeneratorImpl( IdAllocator idAllocator, String idKey, int batchSize )
{
this.idAllocator = idAllocator;
this.idKey = idKey;
this.batchSize = batchSize;
}
public long getNextId()
{
synchronized ( lock )
{
if ( currentId < nextFetchId )
{
long localCurrent = currentId;
currentId++;
return localCurrent;
}
currentId = idAllocator.allocateBatch( idKey, batchSize );
nextFetchId = currentId + batchSize;
return getNextId();
}
}
目前,我主要(但并非总是)以无争议的方式使用它。但是将来它将被多个线程调用。
我考虑过为每个线程实例化一个实例,这可能是最好的方法。然而,作为一种智力/学习经验,我想知道我是否可以改进这个实现,特别是在多个线程频繁调用它时减少 getNextId() 中的潜在争用?