Здравствуйте, webserg, Вы писали:
W>Лок могут захватить кто угодно, так как доступ к объкту класса публичный. И надо следить везде где объект используется, то есть по всему приложению, правильно ли его синхронизируют и не будет ли deadlock. А если объявить просто приватный объект и использовать его для монитора, то все видно в одном классе.
Ну могут, и что с того? А дайте ка мне хоть один на 100% безопасный базовый инструмент синхронизации.
volatile безопасен? Нет, ведь нерадивый программист может изменить поле volatile объекта, подумав, что volatile распространяется и на, все что находится внутри объекта.
final безопасен? Нет, ведь нерадивый программист может потерять гарантии final, если из места обращения к final полю у него будет доступна ссылка на это же поле, но без final семантики.
А ReentrantLock безопасен? Нет, ведь программист может взять лок одном потоке, а отпустить в другом, и, не приведи господь, получить IllegalMonitorStateException!
Безопасных инструментов нет. Более того, они и не нужны. Нужны инструменты, которые легко освоить и легко применять. И synchronized как раз таким и является. А если кто-то не умеет его использовать — пускай почитает соответствующую литературу