Хотя я согласен с тем, что не следует слепо придерживаться догматических правил, сценарий «воровства замков» кажется вам таким эксцентричным? Поток действительно может получить блокировку вашего объекта «извне» (synchronized(theObject) {...}
), блокируя другие потоки, ожидающие синхронизированных методов экземпляра.
Если вы не верите во вредоносный код, учтите, что этот код может быть получен от третьих лиц (например, если вы разрабатываете какой-либо сервер приложений).
«Случайная» версия кажется менее вероятной, но, как говорится, «сделайте что-нибудь защищенное от идиота, и кто-то придумает лучшего идиота».
Так что я согласен со школой мышления "зависит от того, что в классе".
Изменить следующие первые 3 комментария eljenso:
Я никогда не сталкивался с проблемой кражи блокировок, но вот воображаемый сценарий:
Допустим, ваша система представляет собой контейнер сервлетов, а рассматриваемый нами объект - реализация ServletContext
. Его метод getAttribute
должен быть потокобезопасным, поскольку атрибуты контекста являются общими данными; поэтому вы объявляете это как synchronized
. Представим также, что вы предоставляете публичный хостинг на основе реализации вашего контейнера.
Я ваш клиент и разверните мой "хороший" сервлет на вашем сайте. Бывает, что мой код содержит вызов getAttribute
.
Хакер, замаскированный под другого клиента, размещает свой вредоносный сервлет на вашем сайте. Он содержит следующий код в методе init
:
synchronized (this.getServletConfig().getServletContext()) {
while (true) {}
}
Если предположить, что у нас один и тот же контекст сервлета (разрешено спецификацией, если два сервлета находятся на одном виртуальном хосте), мой вызов на getAttribute
заблокирован навсегда. Хакер достиг DoS на моем сервлете.
Эта атака невозможна, если getAttribute
синхронизируется с частной блокировкой, поскольку сторонний код не может получить эту блокировку.
Я допускаю, что пример надуманный и упрощенно дает представление о том, как работает контейнер сервлета, но ИМХО это доказывает это.
Так что я бы сделал свой выбор дизайна исходя из соображений безопасности: получу ли я полный контроль над кодом, который имеет доступ к экземплярам? Каким будет следствие того, что поток удерживает блокировку экземпляра на неопределенный срок?