Это требует некоторого тестирования и профилирования, но я вполне уверен, что вы не добьетесь значительной производительности, используя какие-либо приемы, потому что синхронизация будет выполняться в любом случае, так как вы каждый раз вызываете метод getObject (), чтосинхронизированы.Так что это не различие типа «синхронизация / отсутствие синхронизации», а скорее «синхронизация / двойная синхронизация», которая не должна быть такой большой.Если вы все равно синхронизируете, лучше сделать это в полной мере.Что в вашем случае означает method1 ().
UPDATE
Хотя method2 () тоже может показаться многообещающим, я только что понял проблему с ним: так как он не '• синхронизировать запись в поле obj
, другие потоки могут не увидеть его обновленное значение.Так что если к полям obj
обращаются другие потоки, кроме потока, который вызывает method2 (), то method2 () не верен.
Если вы сделаете поле obj
энергозависимым, я думаю, что этоработать (хотя не уверен на 100%), так как getObject () синхронизирован, поэтому не должно быть проблемы "энергозависимая ссылка на энергонезависимый объект".После возврата getObject () он выполняет барьер записи, поэтому гарантируется, что в основной памяти будет полностью инициализированный объект.И поскольку ни один поток не имеет локально кэшированной копии этого объекта, любой поток может получить доступ к полю obj
.Если объект, на который ссылается поле obj
, не является изменяемым, в этом случае весь доступ к нему должен быть синхронизирован в любом случае.
Хотя это все еще не имеет особого смысла.Полностью несинхронизированный доступ для чтения по-прежнему невозможен, поэтому чистая реализация все же лучше, чем «умная».