Понимание операций ConcurrentSkipListMap - PullRequest
0 голосов
/ 17 июня 2020

Я пытался понять, как реализовать систему клиент-сервер для многопользовательской игры в 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);
    }
}

Я пытался выяснить, как лучше всего удалить все записи с ключами ниже, чем вход метода. И сетевой поток, и поток пользовательского интерфейса клиента могут получить доступ к этой структуре сразу (или, по крайней мере, так я до сих пор считал).

Любое понимание поможет.

...