Вариант 1, очевидно, может быть вызван несколькими программами одновременно с новым ip
, и только последний в блоке if
будет сохранен. Эта возможность значительно увеличивается при увеличении длительности buildComplexActivityObject
, поскольку в критическом разделе больше времени.
Вариант 2 работает, но каждый раз вызывает buildComplexActivityObject
, что, как вы заявляете, не то, что вы хотите.
Учитывая, что вы хотите вызывать buildComplexActivityObject
как можно реже, третий вариант является единственным, который имеет смысл.
Однако sync.Map
не может защитить действительные значения activity
, на которые ссылаются сохраненные указатели. Там также нужна синхронизация при обновлении значения activity
.