Если у вас есть проблемы с параллелизмом, простое добавление 'volatile', вероятно, вам не поможет.
Что касается сохранения объекта в качестве атрибута Session, я бы порекомендовал вам оставить только идентификатор объекта,и использовать его для извлечения «живого» экземпляра, когда он вам нужен (если вы используете Hibernate, последовательные извлечения возвращают один и тот же объект, поэтому это не должно вызывать проблем с производительностью).Инкапсулируйте всю логику модификации для этого конкретного объекта в единый фасад и выполняйте управляющий параллелизм там, используя блокировку dababase.
Или, если вы действительно, действительно хотите использовать блокировку на основе памяти, и действительноубедитесь, что у вас никогда не будет двух экземпляров приложения, запущенного в кластере, убедитесь, что ваша логика фасада синхронизирована на нужном уровне.Если ваша синхронизация слишком мелкая (низкоуровневые операции, , например, переменные переменные ), вероятно, этого будет недостаточно, чтобы сделать ваш код поточно-ориентированным.Например, java.util.Hashtable
полностью синхронизирован, но это ничего не значит, если у вас есть такая логика:
01 if (!hashtable.containsKey(key)) {
02 hashtable.put(key, calculate(key));
03 }
Если два потока, скажем, t1
и t2
, попадут в этот блокв то же время t1
может выполнить строку 01
, затем t2
также может выполнить 01
, а затем 02
, и t1
затем выполнит 02
, переписав то, что сделал t2
,Операции containsKey()
и put()
являются атомарными по отдельности, но то, что должно быть атомарным, это весь блок.
Иногда пересчет значения не имеет значения, но иногда это имеет значение, и будет перерыв.
Когда дело доходит до параллелизма, волшебства нет.Я имею в виду, шов некоторые дурацкие фреймворки пытаются продать вам идею, что они решают эту проблему для вас.Они неДаже если он работает в 99% случаев, он впечатляюще сломается, когда вы начнете работать и начнете получать интенсивный трафик.Или (намного, намного) хуже, он будет молча генерировать неправильные результаты.
Параллельность - одна из самых сложных проблем в программировании.И единственный способ справиться с этим - это избежать этого.Вся эта тенденция функционального программирования не связана с параллелизмом, а состоит в том, чтобы вообще его избегать.