Я написал симулятор фондового рынка, который использует ConcurrentHashMap
в качестве кэша.
Кэш содержит около 75 элементов, но они обновляются и извлекаются очень быстро (~ 500 раз в секунду).
Вот что я сделал:
Тема 1:
Подключен к внешней системе, которая предоставляет мне потоковые кавычки для данного символа акции.
Поток 2 (поток обратного вызова):
Ожидает, когда данные будут переданы ему внешней системой.Получив данные, он анализирует их, создает неизменный объект DataEntry, кэширует его и отправляет сигнал в thread3.
Поток 3 (Поток потребителя): Получив сигнал, получитеDataEntry из кеша и использует его.(Это часть задачи, чтобы не позволить thread2 передавать данные напрямую в thread3).
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.
}
После запуска через профилировщик я заметил, что я создаю lot of DataEntry
объект.И, следовательно, eden заполняется очень быстро.
Итак, я думаю немного изменить дизайн с помощью:
a) Создание класса DataEntry
изменчивым.
b) Предварительное заполнение кэша пустыми DataEntry
объектами.
c) Когда обновление будет получено, получите DataEntry
объект из карты и заполнить поля.
Таким образом, число DataEntry
объекта будет постоянным и равным количеству элементов.
Мои вопросы:
a) Имеет ли этот дизайн какие-либо проблемы с параллелизмом, которые я мог бы внести, сделав изменяемым DataEntry
.
b) Что еще я могу сделать, чтобы оптимизировать кэш?
Спасибо.