Я написал симулятор фондового рынка, который использует ConcurrentHashMap
в качестве кеша.
Кэш содержит около 75 элементов, но они очень быстро обновляются и извлекаются (~ 500 раз в секунду).
Вот что я сделал:
Тема 1:
Подключен к внешней системе, которая предоставляет мне потоковые котировки для данного символа акции.
Поток 2 (поток обратного вызова):
Ожидает, пока данные не будут доставлены ему внешней системой. Как только он получает данные, он анализирует их, создает неизменяемый объект DataEntry, кэширует его и отправляет сигнал в thread3.
Поток 3 (потребительский поток): после получения сигнала извлеките DataEntry из кеша и используйте его. (Часть задачи состоит в том, чтобы не позволить потоку 2 отправлять данные непосредственно в поток 3).
public final class DataEntry{
private final String field1;
private final String field2;
//...
private final String field25;
// Corresponding setters and getters
}
public final class Cache{
private final Map<String, DataEntry> cache;
public Cache( ){
this.cache = new ConcurrentHashMap<String, DataEntry> ( 65, 0.75, 32 );
}
// Methods to update and retrieve DataEntry from the cache.
}
Запустив его через профилировщик, я заметил, что создаю много объектов DataEntry
. И поэтому рай заполняется очень быстро.
Итак, я думаю немного изменить дизайн:
a) Создание изменяемого класса DataEntry
.
b) Предварительное заполнение кеша пустыми DataEntry
объектами.
c) Когда появится обновление, извлеките объект DataEntry
с карты и заполните поля.
Таким образом, количество объектов DataEntry
будет постоянным и равным количеству элементов.
Мои вопросы:
a) Есть ли в этом дизайне какие-либо проблемы параллелизма, которые я мог создать, сделав DataEntry
изменяемым.
b) Можно ли еще что-нибудь сделать для оптимизации кеша?
Спасибо.