#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 условий. Они являются :
- Взаимное исключение — B хочет ресурс, который есть у A. B не может использовать ресурс, который использует A (что происходит здесь).
- Удерживайте и ждите — A удерживает ресурс, который требуется B. A также ожидает освобождения ресурса, который есть у кого-то другого (не происходит для A из приведенного заявления probem)
- Нет вытеснения — ресурс, который удерживает A, не может быть вырван у него силой (при условии, что это верно здесь, потому что не дано другого способа).
- Циклическое ожидание — A удерживает ресурс, который хочет B. B удерживает ресурс, который нужен A (здесь этого не происходит).
Следовательно, мы видим здесь, что не все условия соблюдены. Таким образом, в этой ситуации не может быть тупика.
Однако существует бесконечный цикл, из-за которого A никогда не отказывается от блокировки. Следовательно, Б будет голодать.
Это должно рассеять ваши сомнения. Ваше здоровье