マルチスレッド環境で使用するhi-lo Idジェネレーターがあります。ジェネレーターは、スレッドごとに毎秒 10 万回まで呼び出すことができます
私は、うまく機能するかなり良い(そして安全な)実装を持っています。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();
}
}
現時点では、常にではありませんが、ほとんどの場合、これを競合のない方法で使用しています。ただし、将来的には複数のスレッドから呼び出されるようになります。
スレッドごとにこれの 1 つのインスタンスをインスタンス化することを検討しましたが、これがおそらく最良の方法です。ただし、知的/学習経験として、特に複数のスレッドが頻繁に呼び出しているときに getNextId() の潜在的な競合を減らすために、この実装を改善できるのではないかと思いましたか?