Java

Deadlock (многопоточность) в java

Добрый вечер, изучал сейчас эту тему по ролику 6ти летней давности. Попытался повторить пример в видео и у меня не удалось вызвать Deadlock. Было 2 потока, которые ссылались на друг друга и в них были статические методы с синхронизацией. Вроде бы класс должен был залочиться от таких методов, тк они статические, но всё прекрасно отработало. Возможен ли еще дедлок в джаве, если да, то приведите пример, пожалуйста.
Дело в том, что ключевое слово «synchronized» в сигнатуре метода несёт в себе роль текущего ОБЪЕКТА.

Давайте подробнее!!!
У нас есть
synchronized void a() {
...
}
И у нас есть
void b() {
synchronized(this) {
...
}
}

И вот всё дело в том, что оба метода логически не отличаются, просто первый способ есть в качестве сахара.

И что это даёт?
Дело в том, что у каждого ОБЪЕКТА есть так называемый «экран». Так вот, как раз «synchronized» захватывает экран текущего объекта, то есть this (this - указание на текущий объект, с которым идёт работа (этот) - было сделано для того, чтобы упростить работу с объектами, ибо каждый класс может иметь хоть миллион экземпляров)

Ок, иче дальше типо?
Напомню, что речь в вопросе идёт о:
synchronized static void a() {}

Че значит этот static?
Статический метод, и нет, это не тот, который нельзя изменять, проще говоря, это такой метод, который принадлежит не самому объекту, а целому классу. Из статических методов вы не можете обращаться к объектам. И не потому что создатели Java такие противные, а потому что класс всего один, а объектов много. Вот и сиди думай, че, к какому это this обращаться из миллиона...

Подводим итоги:
«synchronized» синхронизируется на текущем объекте, поэтому в статисеских методах его наличие бессмысленно (но это неточно).

Чел, ну типо я хочу юзать синхронизацию в статике. И че мне мне терь делать?
Для таких ситуаций комунете Java придумало java.util.concurrent (или java.concurrent не помню, ide уже совсем мозг туманит(((). Есть замечательный класс ReentrantLock, который выполняет аналогичную работу. Конечно, есть еще один выход: создавать объекты, типо static Object lock = new Object(); (synchronized(lock) {}), но зачем такой херней заниматься, если есть первый способ.

Удачи!
Олег Николаев
Олег Николаев
11 272
Лучший ответ
Методы с синхронизацией ничего не блокируют. Блокировать можно каким-нибудь семафором, например.
Виктор Хабурин ну тая если бы синхронизация не блокировала ничего, то она бы нечего не синхронизировала
Виктор Хабурин synchronized.

Им помечается определенный кусок нашего кода. Если блок кода помечен ключевым словом synchronized, это значит, что блок может выполняться только одним потоком одновременно.
Макс Слугин Мб ReentrantLock?
Макс Слугин А может и та. Я видос не чекал)
покажи код
дедлок возможен всегда, если тебе в руки дают низкоуровневые примитивы синхронизации и ты их неправильно используешь, просто иногда дедлок гарантирован, а иногда на него ещё попасть нужно умудриться
Tac Taraz
Tac Taraz
36 952
Виктор Хабурин https: //www .youtube. com/watch?v=_DcbJ3eYULw&list=PL786bPIlqEjRDXpAKYbzpdTaOYsWyjtCX&index=75&t=322s 8:45