Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
1. public Entity getNext() {
2. int currentPosition = position.getAndIncrement();
3. int maxPosition = objectList.size();
4. position = position.get() > MAX_COUNTER ? new AtomicInteger(0) : position;
5. return objectList.get(currentPosition % maxPosition);
6. }
public int getNextId() {
int currentPosition = position.getAndIncrement();
if (currentPosition < 0) {
currentPosition += Integer.MAX_VALUE; // Integer.MAX_VALUE == 2^31 - 1
currentPosition++; // Сделаем кратным 2^31
assert (currentPosition > 0); // Нет переполнения
}
return objectList.get(currentPosition % objectList.size());
}
private AtomicInteger currentId = new AtomicInteger();
public int getNextId() {
for (;;) {
int current = currentId.get();
int next = current + 1;
if (next>MAX_ID) {
next = 0;
}
if (currentId.compareAndSet(current, next)) {
return next;
}
}
}
Ну и потом list.get(getNextId())
Если серверов мало(допустим 2), а потоков много (допустим 20), то эта проверка может привести к неравномерному распределению запросов по потокам(Большая часть потоков может уйти к серверу под номером 0)
Реализация потокобезопастного алгоритма round-robin на Java