У блокировки публично видимых объектов есть одна большая проблема: вы не можете рассуждать о поведении класса в изоляции.
Причина в том, что другие части кода также могут синхронизироваться с вашим объектом класса, что может привести к тому, что ваш метод getContext()
будет блокироваться бесконечно.
Теперь, как вы можете себе представить, на практике это редко является проблемой *. Но когда это (а иногда и так), это абсолютный кошмар для отладки и идентификации. Поэтому, учитывая, как просто определить частный объект блокировки и синхронизировать его, я бы пошел с ним.
* Предполагается, что вредоносного кода нет. Если вы действительно этого хотите, вы можете делать действительно неприятные вещи, синхронизируя по невольно разделяемым объектам, как этот пример , который я создал, который «незаметно» соединяет входной и выходной потоки.