Synchronized-блок Java

103
17 февраля 2021, 14:00

Есть два класса

Deadlock1.java

class Client {
   final Object resource1 = "resource1";
   final Object resource2 = "resource2";
   void doS1() {
       synchronized(resource1) {} 
    }
    void doS2() {
       synchronized(resource2) {}
    }
 }
public class Deadlock1 {
  public static void main(String[] args) {
  Client client = new Client();
  new Thread(
      () ->
             {
               client.doS1();
               try {
                Thread.sleep(50);
              } catch (InterruptedException e) {
             }
              client.doS2();
      }).start();
     new Thread(
      () ->
             {
              client.doS2();
              try {
                Thread.sleep(50);
              } catch (InterruptedException e) {
            }
             client.doS1();
      }).start();
  }
}

and Deadlock2.java

class Client {
    final Object resource1 = "resource1";
    final Object resource2 = "resource2";  
}
public class Deadlock2{
  public static void main(String[] args) {
     Client client = new Client();
     new Thread(
      () ->
      {
        synchronized (client.resource1) {
        try {
            Thread.sleep(50);
          } catch (InterruptedException e) {
       }
       synchronized (client.resource2) {}
        }
      }).start();
     new Thread(
      () ->
             {
        synchronized (client.resource2) {   
          try {
            Thread.sleep(50);
          } catch (InterruptedException e) {
          }
              synchronized (client.resource1) {}
        }
      }).start();
  }
}

В Deadlock1 дедлок не просиходит, а в Deadlock2 - происходит. Не могу понять в чём разница? И почему в Deadlock2 синхроблок это часть кода потока, а не класса Client - т.е какого-то участка кода,который могут выполнять разные потоки?

Answer 1

В Deadlock2 каждый поток сначала захватывают одну блокировку, и удерживая ее пытается захватить вторую. Закономерно что получается дедлок.

А в Deadlock1 каждый поток захватывает свою блокировку, а затем ее отпускает , и после паузы захватывает другую. Закономерно что нет дедлока.

READ ALSO
Добавить в объект такую часть кода

Добавить в объект такую часть кода

Нужно выводить изображение на канвасе через объект, все изображения необходимо добавить в объектПоскажите, как это сделать?

93
Как получить массив из двух массивов, минуя повторяющиеся элементы?

Как получить массив из двух массивов, минуя повторяющиеся элементы?

Уважаемые не подскажите или не подтолкнете к верному решениюЕсть два массива

94
Не отслеживает изменения в watch

Не отслеживает изменения в watch

Так я передаю объект с данными в родительском контроле,который находится в popup окне:

98