2017-01-24 12 views
1

Я начинаю с многопоточности в Java и столкнулся со следующей проблемой.Должен ли я заблокировать целый объект в функции, изменяющей ее небольшую часть?

Предположим, у нас есть объект, содержащий набор целых чисел и другие переменные.

Я хочу создать функцию, изменяющую одно из целых чисел.
Должен ли он заблокировать весь объект или только коллекцию?

Я понимаю, что блокировка всего объекта будет работать, но я боюсь, что у меня будет снижение производительности, если другие потоки попытаются получить доступ к другим переменным моих объектов.

+4

Если вы начинаете с многопоточности, вам следует беспокоиться о правильности, а не о производительности. – Kayaman

+2

Вы должны синхронизировать доступ ко всем общим изменяемым состояниям. – duffymo

+0

Вы можете сделать некоторый метод синхронизированным, и производительность снизится только для этих методов. Разумеется, параллельные вызовы других методов для одного и того же объекта должны обеспечивать правильность. Если они не могут заблокировать целый объект. – Zefick

ответ

0

Должен ли он заблокировать весь объект или только коллекцию?

Это будет главным образом зависеть от того, что вы на самом деле имеете в этом классе. Как уже упоминалось, вам нужно синхронизировать доступ ко всему совместному изменяемому состоянию, поэтому, предполагая, что весь ваш объект является общим изменчивым состоянием, вам действительно нужно защитить любой доступ на чтение и запись к любому из его полей с неявным или внутренним блокированием.

Теперь вопрос в том, как эти поля связаны друг с другом?

Действительно, скажем, что ваши поля являются List моркови и List автомобилей, они не имеют ничего общего ожидать, будучи общие изменяемыми списками, в этом случае вы можете использовать один выделенную неявную или внутреннюю блокировку каждого поля.

Но если у вас есть, например, курс евро к доллару и курс доллара к евро, которые напрямую связаны друг с другом, так как вам необходимо обеспечить согласованность обоих полей, вам нужно будет использовать тот же неявный или внутренний блокировка для обоих полей.

Итак, чтобы суммировать, если все ваши поля связаны друг с другом с помощью одного имплицитного или встроенного блокирования для всех из них, будет способом использовать в противном случае одну выделенную неявную или внутреннюю блокировку для каждой группы полей, которые связаны друг с другом ,

+0

В моем случае у меня есть что-то вроде списка моркови и списка автомобилей. Поэтому, если я правильно понял, я мог бы использовать набор из двух разных замков, один для моркови и один для автомобилей? –

+0

да, это идея, извините за глупый пример, но я думаю, что это проще понять. –

+1

Нет проблем, это действительно помогло мне понять, это именно то, что мне было интересно. Большое спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^