Sobes.tech
Senior

Kodning asosiy noto'g'ri ishlash sababini nima? Ob'ektlarning o'zgarmasligi buzilgan Yarpaqlama holati boshqarilmayapti Kilitlangan obyektlar ziddiyatlari muammoga olib keladi Resurslarning ortiqcha sinxronizatsiyasi Ob'ektlarning boshlang'ich holatlari initialized emasimport 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 AI

AIден жооп

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

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

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

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

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

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

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