Должен ли он заблокировать весь объект или только коллекцию?
Это будет главным образом зависеть от того, что вы на самом деле имеете в этом классе. Как уже упоминалось, вам нужно синхронизировать доступ ко всему совместному изменяемому состоянию, поэтому, предполагая, что весь ваш объект является общим изменчивым состоянием, вам действительно нужно защитить любой доступ на чтение и запись к любому из его полей с неявным или внутренним блокированием.
Теперь вопрос в том, как эти поля связаны друг с другом?
Действительно, скажем, что ваши поля являются List
моркови и List
автомобилей, они не имеют ничего общего ожидать, будучи общие изменяемыми списками, в этом случае вы можете использовать один выделенную неявную или внутреннюю блокировку каждого поля.
Но если у вас есть, например, курс евро к доллару и курс доллара к евро, которые напрямую связаны друг с другом, так как вам необходимо обеспечить согласованность обоих полей, вам нужно будет использовать тот же неявный или внутренний блокировка для обоих полей.
Итак, чтобы суммировать, если все ваши поля связаны друг с другом с помощью одного имплицитного или встроенного блокирования для всех из них, будет способом использовать в противном случае одну выделенную неявную или внутреннюю блокировку для каждой группы полей, которые связаны друг с другом ,
Если вы начинаете с многопоточности, вам следует беспокоиться о правильности, а не о производительности. – Kayaman
Вы должны синхронизировать доступ ко всем общим изменяемым состояниям. – duffymo
Вы можете сделать некоторый метод синхронизированным, и производительность снизится только для этих методов. Разумеется, параллельные вызовы других методов для одного и того же объекта должны обеспечивать правильность. Если они не могут заблокировать целый объект. – Zefick