Лично, я думаю ответы, которые настаивают, что это никогда не, или только редко исправляйте для синхронизации на this
, дезинформированы. Я думаю, что это зависит от Вашего API. Если Ваш класс является ориентированной на многопотоковое исполнение реализацией и Вами, так зарегистрируйте его, то необходимо использовать this
. Если синхронизация не должна делать каждый экземпляр класса в целом ориентированным на многопотоковое исполнение в вызове, он - открытые методы, то необходимо использовать частный внутренний объект. Допускающие повторное использование компоненты библиотеки часто попадают в бывшую категорию - необходимо думать тщательно, прежде чем Вы не разрешите пользователю обертывать свой API во внешнюю синхронизацию.
В бывшем случае, с помощью this
позволяет нескольким методам быть вызванными атомарным способом. Одним примером является PrintWriter, где можно хотеть произвести несколько строк (скажите отслеживание стека консоли/регистратору), и гарантируйте, что они появляются вместе - в этом случае то, что это скрывается, синхронизирующий объект внутренне является реальной болью. Другим таким примером являются синхронизируемые обертки набора - там необходимо синхронизироваться на самом объекте коллекции для итерации; так как повторение состоит из нескольких вызовов метода, Вы не можете защищать его полностью внутренне.
В последнем случае, я использую простой объект:
private Object mutex=new Object();
Однако видевший много дампов JVM и отслеживаний стека, которые говорят, блокировка является "экземпляром java.lang. Объект ()" я должен сказать, что использование внутреннего класса могло бы часто быть более полезным, как другие предположили.
Так или иначе, это - моя ценность на два бита.
Редактирование: Еще одна вещь, при синхронизации на this
я предпочитаю синхронизировать методы и сохранять методы очень детализированными. Я думаю, что это более ясно и более кратко.
Используйте функцию «Код очистки».
Порядок элементов можно настроить в параметрах ReSharper на языках, C #, макет членов типа. Это хорошо документированная спецификация макета XML, которую ReSharper использует при переупорядочении элементов.
В качестве альтернативы можно рассмотреть Regionerate . Мы используем и любим ReSharper, но Regionerate соответствует нашим потребностям в создании регионов и сортировке / перестановке членов. И, конечно же, все это настраивается.
ОБНОВЛЕНИЕ: Вместо этого мы начали использовать ReSharper's Code Cleanup .