Sobes.tech
Senior

Kodun əsas düzgün olmayan davranışının səbəbi nədir? Obyektlərin dəyişməzliyi pozulub Yarpaqlama vəziyyəti idarə olunmur Qapanma ilə əlaqəli obyektlərin qarşıdurması tıxac vəziyyətinə səbəb olur Resursların həddindən artıq sinxronlaşdırılması Obyektlərin başlanğıc vəziyyətləri initialized deyilimport java.util.concurrent.*; class Competition { private final Object lock = new Object(); public void syncMethodA(Competition competitor) { synchronized (lock) { try { Thread.sleep(100); } catch (InterruptedException e) {} competitor.syncMethodB(this); } } public void syncMethodB(Competition competitor) { synchronized (lock) { try { Thread.sleep(100); } catch (InterruptedException e) {} competitor.syncMethodA(this); } } } public class FitnessApp { public static void main(String[] args) { Competition comp1 = new Competition(); Competition comp2 = new Competition(); Thread t1 = new Thread(() -> comp1.syncMethodA(comp2)); Thread t2 = new Thread(() -> comp2.syncMethodB(comp1)); t1.start(); t2.start(); } }

sobes.tech Süni İntellekt

AI-dan cavab

Основная причина некорректного поведения кода — конфликт объектов блокировки приводит к тупиковой ситуации (deadlock).

В данном примере два объекта Competition пытаются захватить блокировки друг друга:

  • comp1.syncMethodA(comp2) захватывает comp1.lock и пытается вызвать comp2.syncMethodB(this), которая пытается захватить comp2.lock.
  • Одновременно comp2.syncMethodB(comp1) захватывает comp2.lock и пытается вызвать comp1.syncMethodA(this), которая пытается захватить comp1.lock.

В итоге оба потока ждут освобождения блокировки, которую держит другой поток — классический deadlock.

Чтобы избежать этой ситуации, нужно:

  • Использовать один и тот же объект блокировки для всех синхронизированных методов.
  • Избегать вложенных вызовов, которые требуют захвата нескольких блокировок.
  • Применять таймауты или другие механизмы предотвращения взаимных блокировок.

Пример исправления — использовать один общий lock для всех объектов или перестроить логику без перекрестных вызовов с блокировками.