Когда мы делаем вызов для использования между синхронизированным методом и синхронизированным блоком - PullRequest
1 голос
/ 13 мая 2010

Может кто-нибудь, пожалуйста, поделитесь своим опытом на «Когда мы делаем вызов между синхронизированным методом и синхронизированным блоком» Есть проблемы с производительностью?

Ответы [ 5 ]

1 голос
/ 13 мая 2010

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

Если вы хотите заблокировать на время вызова метода И вы хотите заблокировать this (или текущий класс для static метода), тогда методы synchronized являются правильным решением.

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

Точно так же, если требуется выполнить только часть кода в вызове процедуры, удерживая блокировку, лучше использовать синхронизированный блок и просто указать , чтокод в блоке.

Какие-либо проблемы с производительностью?

Нет, кроме общего принципа, что держать блокировку дольше, чем вы, - плохая идеянужно.(Чем дольше удерживается блокировка, тем больше вероятность того, что другим потокам придется ждать.)

0 голосов
/ 13 мая 2010

С точки зрения общей производительности, нет никакой разницы между синхронизированным блоком или методом. Проблема действительно с точки зрения практики кодирования. Синхронизация метода кажется легкой задачей, однако при работе с несколькими людьми в проекте для кого-то становится возможным изменить простой метод, который другой синхронизировал, на тяжелый. Фактически, один действительно хороший пример (из личного опыта) того, где вы можете столкнуться с проблемами, - это когда вы используете инфраструктуру внедрения зависимостей и у вас есть методы в сервисном объекте, которые взаимодействуют с синхронизируемыми объектами доступа к данным (daos). Ожидается, что даос будут работать быстро, поэтому блокировки удерживаются только на короткое время. Приходит кто-то еще и либо изменяет даос, либо создает и вводит новые, которые намного медленнее, и внезапно вещи начинают действительно замедляться, потому что объект службы синхронизировал взаимодействие с ним.

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

0 голосов
/ 13 мая 2010

Я склонен использовать синхронизированные методы, когда это общедоступный интерфейс, который требует синхронизации (например, синхронизированные коллекции) и синхронизированных блоков для внутренней синхронизации класса, такой как доступ к общему ресурсу, который должен быть безопасным для потоков.

Существует также проблема читабельности. Я считаю синхронизацию на уровне методов более точной и очевидной, поскольку код не загроможден управлением блокировками.

Что касается производительности, я не знаю каких-либо особых различий в поведении обоих подходов. Я думаю, что более важно избежать чрезмерной синхронизации, поэтому метод, которому нужен только доступ к общему ресурсу 1 из 10 вызовов, должен использовать уровень блока, а не синхронизацию на уровне метода.

Мой подход к любому сценарию обычно основан на сочетании этих факторов, измененных предыдущим опытом.

0 голосов
/ 13 мая 2010

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

0 голосов
/ 13 мая 2010

Я не уверен, что вы подразумеваете под "синхронизированным заявлением". Вы используете ключевое слово synchronized для обозначения того, что метод синхронизирован, или (как вы упоминаете) блока кода внутри него.

Обычно я предпочитаю, чтобы методы были небольшими и управляемыми, и поэтому помечали весь метод как синхронизированный (при необходимости). Преимущество этого заключается в том, что пользователю класса сразу видно, какие методы представляют критические секции. Это также позволяет программисту легче определять, является ли класс потокобезопасным, а именно: Все ли открытые методы, которые обращаются к изменяемым данным, помечены как синхронизированные?

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

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