Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Имеется единственный экземпляр класса, к которому в течение часа могут обращаться разные потоки для чтения и модификации. Операции синхронизированы, тут проблем нет. В экземпляре класса много всякого и разного.
PD>Раз в час этот экземпляр должен заменяться на новый экземпляр, который в течение прошедшего часа изготавливался.
PD>По логике вещей эту замену надо проводить атомарно. Но тогда все методы чтения и изменения в течение часа должны добираться к этому экземпляру через блокировку. Пустая трата времени в течение часа.
Если я правильно понял, то операции определенные в данном классе уже синхронизированы, т.е. не требует какой-либо дополнительной блокировки со стороны вызывающего кода. В таком случае разве недостаточно сделать переменную, которая хранит ссылку на текущий экземпляр volatile? В таком случае блокировки для получения данной ссылки не требуется.
PD>А вот в Яве боюсь. Что, если в это время влезет GC и посчитает нужным удалить старый экземпляр до того, как ссылка обновилась ? Или это невозможно ?
Никаких проблем тут с GC быть не должно. В любой момент времени на экземпляр класса ссылается либо статическая volatile переменная через которую организован доступ к объекту, либо локальный фрейм одного из потоков который работает с объектом. Пока эти ссылки есть (а они будут существовать до тех пор пока 1) вы не обновите статическую переменную; 2) все потоки не закончят работать со старым объектом), GC ничего удалять не имеет права.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde