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) {}), но зачем такой херней заниматься, если есть первый способ.
Удачи!
Давайте подробнее!!!
У нас есть
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) {}), но зачем такой херней заниматься, если есть первый способ.
Удачи!
Методы с синхронизацией ничего не блокируют. Блокировать можно каким-нибудь семафором, например.
покажи код
дедлок возможен всегда, если тебе в руки дают низкоуровневые примитивы синхронизации и ты их неправильно используешь, просто иногда дедлок гарантирован, а иногда на него ещё попасть нужно умудриться
дедлок возможен всегда, если тебе в руки дают низкоуровневые примитивы синхронизации и ты их неправильно используешь, просто иногда дедлок гарантирован, а иногда на него ещё попасть нужно умудриться
Виктор Хабурин
https: //www .youtube. com/watch?v=_DcbJ3eYULw&list=PL786bPIlqEjRDXpAKYbzpdTaOYsWyjtCX&index=75&t=322s 8:45
Похожие вопросы
- Всем привет. Помогите плз. Мне нужна помощь тех кто действительно хорошо знает Java т. к мне нужно выбрать один из курсов
- Помогите доделать код на java. В форму пользователь вводит символ, который нужно заменить на #.
- Не выводит изображение в JAVA
- Java проблема с рефлексией.
- Java Developer vs Android Developer. Куда дальше?
- Пишут ли стартапы на Java?
- С какой книги начинать изучение Java?
- Помогите сделать java приложение! { СРОЧНО }
- Java и какой толк работать именно в консоле?
- Подскажите пожалуйста, как в данном коде Java сделать так, чтоб при нажатии цифры 3 программа завершала свою работу?
Им помечается определенный кусок нашего кода. Если блок кода помечен ключевым словом synchronized, это значит, что блок может выполняться только одним потоком одновременно.