Код: Выделить всё
public class SequenceGenerator {
private static final SequenceGenerator GENERATOR = new SequenceGenerator();
private final AtomicInteger sequence = new AtomicInteger(0);
private final AtomicInteger resetCount = new AtomicInteger(0);
private SequenceGenerator() {}
public static SequenceGenerator getInstance() {
return GENERATOR;
}
/**
* This method a unique sequenceId that follow this format
* [ResetCount-SequenceNumber]. The SequenceNumber range is [0000,9999]
* and every time the max value 9999 exceeds, it will reset back to zero
* and the ResetCount value will increase by one.
*
* @return a unique sequenceId in literal format
*/
public String generateSequenceId() {
while (true) {
int local = sequence.getAndIncrement();
if (local
Я обновил метод выше, и, надеюсь, это согласно спецификациям и защитным потокам < /p>
private final AtomicInteger sequence = new AtomicInteger(0);
private final AtomicInteger resetCount = new AtomicInteger(0);
private final Object resetLock = new Object();
public String generateSequenceId() {
while (true) {
int local = sequence.getAndIncrement();
if (local =10000){
sequence.set(0);
resetCount.incrementAndGet();
}
}
}
}
}
< /code>
В последнем обновлении кода предложение заключается в том, что номер сброса номера последовательности сброса и сброса находится внутри синхронизированного блока. Только один поток запускает сброс последовательности и увеличивает количество сброса.>
Подробнее здесь: [url]https://stackoverflow.com/questions/79475109/how-to-safely-reset-atomicinteger-value-in-highly-multithreaded-environment[/url]