У меня есть карта (назовем ее исходной картой), которая изначально нулевая. Во время развертывания службы и каждый час после этого мне нужно обновить эту карту или, по сути, переоценить ее.
Вот как я это делаю. При обновлении я создаю новую карту и возвращаю немодифицируемое представление карты этой новой карты на мою исходную карту, теперь, когда происходит это переназначение, то есть ссылка на исходную карту изменяется, повлияет ли это на любой другой поток, в настоящее время обращающийся к оригинальная карта? Следует отметить, что во время развертывания службы исходной карте присваивается значение аналогичным образом, в основном используется та же стратегия обновления.
private static Map<String, PricingPriceList> plInfoByName;
TransactionData.plInfoByName = plInfo.get(0);
Здесь plInfoByName — моя исходная карта, а plInfo содержит список неизменяемых карт. Вот как заполняется список plInfo
Map<String, PricingPriceList> plInfoByName = new HashMap<String, PricingPriceList>();
Map<String, PricingPriceList> plInfoById = new HashMap<String, PricingPriceList>();
try {
stmt = dbConn.createStatement();
stmt.setFetchSize(10000);
rs = stmt.executeQuery(query);
PricingPriceList plDetails = null;
while (rs.next()) {
plDetails = new PricingPriceList();
//populate plDetails attributes
plInfoByName.put(rs.getString(0), plDetails);
plInfoById.put(rs.getString(1), plDetails);
}
} catch (Exception e) {
LOGGER.ERROR("Error executing refreshPlInfo. Affected in-memory objects: plInfoByName, plInfoById.", e);
} finally {
try {
if (stmt != null && !stmt.isClosed()) {
stmt.close();
}
if (rs != null && !rs.isClosed()) {
rs.close();
}
} catch (SQLException e) {
LOGGER.ERROR("refreshPlInfo failed to close SQL statement or resultset.", e);
}
}
// Return unmodifiable version
List<Map<String, PricingPriceList>> plInfo = new ArrayList<Map<String, PricingPriceList>>();
plInfo.add(Collections.unmodifiableMap(plInfoByName));
plInfo.add(Collections.unmodifiableMap(plInfoById));
return plInfo;
Итак, когда я это сделаю, повлияет ли это на любой поток, читающий TransactionData.plInfoByName? Или это потокобезопасно, потому что в нем хранится немодифицируемая карта.
TransactionData.plInfoByName = plInfo.get(0);