Синхронизация по библиотеке / сторонним классам? - PullRequest
5 голосов
/ 27 февраля 2011

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

Ответы [ 2 ]

1 голос
/ 27 февраля 2011

Java позволяет вам это делать, но НЕ. Вы должны очень усердно работать, чтобы инкапсулировать блокировку в классе или в наименьшем возможном блоке.

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

Взгляните на этот вопрос и подумайте, как он применяется к блокировке сторонних объектов.

Кроме того, обязательная ссылка на JCiP - Прочитайте Java Concurrency на практике для всестороннего, удобочитаемого и высококачественного обсуждения того, как создавать параллельные программы.

0 голосов
/ 27 февраля 2011

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

Если «кажется, это может быть плохая идея», то, вероятно, так и есть. Потоки непостоянны, и если вы не докажете, что это правильно, то, скорее всего, нет (если только не случайно).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...