Java

Нас обманывали! Что на самом деле означает synchronized void doSomething()

Везде, где я читал, писали, что якобы
synchronized void doSomething() { . .}
эквивалентно
void doSomething() {
  synchronized (this) { . .}
}

На картинках ниже доказано, что это не так. При случаи с статичным методом это не проходит.

Так в чём секрет synchronized void doSomething() { . .} ?
Дмитрий Кот
Дмитрий Кот
1 675
что, уже не только ученые врут. Создатели ЯП тоже врут? Ох уж этот мировой заговор! Держать программистов за дурачков чтобы легче было ими управлять ))))
СП
Сергей Прачев
15 161
Лучший ответ
скажи, а всё что ты здесь спрашиваешь -- ты реально это запомнил и используешь?
Дмитрий Кот Полезные ответы запоминаю.
Нас никто не обманывает, мы уже давно явой не пользуемся и забыли что это впринципе такое.
Максим Тятенко
Максим Тятенко
74 422
Примеры в самом вопросе - действительно эквивалент. Тут даже логически все видно.
А вот в том, что вы приложили в скриншотах - вы принципиально разные вещи рассматриваете.
В тексте вопроса у вас оба метода обычные, на скриншотах - обычный и статический.
Как бы некорректно сравниваете.
Пётр Лейнекер
Пётр Лейнекер
55 095
Дмитрий Кот Согласен, что эквивалентны по принципу работы, но то, что помещено в блок synchronyzed, может быть всё, что угодно. И это не значит, что там стоит именно экземпляр того класса, в котором он был объявлен.
оно и эквивалентно, просто у тебя не обычные методы, а статические
они синхронизируются не на this, которого у них и нету, а на Class< ...> (в данном случае Main.class)
Сергей Суслов
Сергей Суслов
36 956
Дмитрий Кот Раз так, то всегда должно быть Class<?>. Вопрос: зачем тогда this?
Дмитрий Кот Я согласен на то, что оба способа можно использовать, но важно понимать, что это разные вещи.
Дмитрий Кот По вашему, VM проверяет, является ли метод статичным или нет, и потом решает что использовать, чтобы организовать одно и то же? :)

Я вообще думаю, что там по умолчанию стоит new Object()
Нельзя обращаться из статического к нестатическому. Статическое принадлежит классу. Нестатическое объекту. К какому объекту this у тебя обратится класс, когда объектов вовсе нет или их много?
во-первых, надо понимать разницу между синхронизации на объекте и на классе и разницу между static методом и instance методом, вы видно этого не понимаете раз такое развели в комментариях и не надо Вам спорить, то как Вы пишете код и какие вопросы задаете, говорит о том, что вы даже не Java Junior Dev. Все это говорит о том, что вы собеседование на Junior пока не пройдете. Так вот слушайте умных людей, которых тут достаточно. В данной теме ответили Full Stack, Alexey, user49913,Zhenya7727 и все эти люди знают тему получше Вас, не надо спорить с ними.
во-вторых, вы вопросы вообще свои закрываете после того, как Вам уже по несколько человек ответили неделю назад? или вы коллекционер открытых вопросов?
Дмитрий Кот Я считаю, что везде нужно иметь своё мнение.
Akramjon Qoraboyev те кто отвечают не Java Junior и не стажеры. Тот же Full Stack видно, что человек с большим опытом, он четко формирует свои мысли и быстро пишет код. Этот человек минимум 3 года пашет и получает от 150 т. р. а может он вообще Senior с зп 250-300 т. р. Основание то, что КОД НЕ КОМПИЛИТСЯ, компилятор определяет, можешь ты так писать или не можешь, он говорит не можешь, не будешь же ты с компилятором спорить. java non-static variable this cannot be referenced from static context. Какие вопросы. Нельзя так делать и точка