Java многопоточный тупик или истощение?

#java #multithreading #deadlock #thread-synchronization #starvation

#ява #многопоточность #тупиковая #синхронизация потоков #истощение #java

Вопрос:

Я готовлюсь к экзамену OCP и пытаюсь понять, когда мы говорим о тупиковой ситуации потока или о том, что поток находится в состоянии голода. в случае приведенного ниже сценария у меня есть сомнения.

 public class ThreadTest {

private static int i = 0;
    
public static void doSomething() {
synchronized(ThreadTest.class) {
    while(true) {
      System.out.println("count:"     i)
    } }
}

public static void main(String args[]) { 
New Thread(() -> doSomething()).start();
New Thread(() -> doSomething()).start();
}}
  

Первый поток, который получает блокировку синхронизированного класса ThreadTest в doSomething(), переходит в бесконечный цикл, никогда не снимая блокировку.
Второй поток продолжает ждать, пока ресурс не станет доступным (чего никогда не происходит).

Говорим ли мы о тупике в этой ситуации или о голоде? Я думаю о Голодании, потому что один поток не получает доступа к общему ресурсу, и из-за взаимоблокировки потоки блокируют ресурсы друг друга. Но на всякий случай я спрашиваю об этом здесь.

Взаимоблокировка описывает ситуацию, когда потоки блокируются навсегда.

Голодание описывает ситуацию, когда поток не может получить регулярный доступ к общим ресурсам.

Комментарии:

1. Существует 4 необходимых и достаточных условия для взаимоблокировки, одним из которых является циклическое ожидание блокировок, чего вы не можете делать здесь, поскольку приобретается только одна блокировка.

2. Посмотрите на свои собственные описания взаимоблокировки и истощения. Что из двух здесь происходит? Оба потока ожидают и заблокированы или один из потоков что-то делает?

Ответ №1:

Как указано в комментарии. Взаимоблокировка происходит при выполнении следующих 4 условий. Они являются :

  1. Взаимное исключение — B хочет ресурс, который есть у A. B не может использовать ресурс, который использует A (что происходит здесь).
  2. Удерживайте и ждите — A удерживает ресурс, который требуется B. A также ожидает освобождения ресурса, который есть у кого-то другого (не происходит для A из приведенного заявления probem)
  3. Нет вытеснения — ресурс, который удерживает A, не может быть вырван у него силой (при условии, что это верно здесь, потому что не дано другого способа).
  4. Циклическое ожидание — A удерживает ресурс, который хочет B. B удерживает ресурс, который нужен A (здесь этого не происходит).

Следовательно, мы видим здесь, что не все условия соблюдены. Таким образом, в этой ситуации не может быть тупика.

Однако существует бесконечный цикл, из-за которого A никогда не отказывается от блокировки. Следовательно, Б будет голодать.

Это должно рассеять ваши сомнения. Ваше здоровье