Я пытался понять, как реализовать систему клиент-сервер для многопользовательской игры в Java. Сейчас я нахожусь на этапе «Согласование» и думал, что использование ConcurrentSkipListMap
может быть лучшей структурой данных, но я никогда не ошибался с этим.
Я изо всех сил пытаюсь понять, как эффективно играть с этим классом: каковы Big-O
операции, какие из них являются наиболее быстрыми или более безопасными для доступа к потокам и т. д. c.
Например, вот выдержка:
public class StateRecords {
/**
* The {@link Long} is the Timestamp of the server's generated GameStateDto (Objects here, for simplicity's sake).
*/
private ConcurrentNavigableMap<Long, Object> localRecord = new ConcurrentSkipListMap<>();
public StateRecords() {
}
public void discardUpTo(Long timestamp) {
/* 1) One possible way to do it. */
Long lowerKey = localRecord.lowerKey(timestamp);
while(lowerKey != null) {
localRecord.remove(lowerKey);
lowerKey = localRecord.lowerKey(timestamp);
}
/* 2) Another possible way to do it. */
localRecord.headMap(timestamp).forEach((k,v) -> localRecord.remove(k));
/* 3) Yet some other solution. */
localRecord.headMap(timestamp).clear();
/* 4) I believe that one is wrong. */
localRecord = localRecord.tailMap(timestamp, true);
}
}
Я пытался выяснить, как лучше всего удалить все записи с ключами ниже, чем вход метода. И сетевой поток, и поток пользовательского интерфейса клиента могут получить доступ к этой структуре сразу (или, по крайней мере, так я до сих пор считал).
Любое понимание поможет.