Пример SSCCE (модифицированный):
public class ThreadTest {
public static void main(String[] args) {
new Thread() {
public void run() {
try {
FirstWord.writeFirstWord(false);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
new Thread() {
public void run() {
try {
SecondWord.writeSecondWord(false);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
class FirstWord {
public static synchronized void writeFirstWord(boolean fromSecondWord) throws Exception {
System.out.println("FirstWord start");
Thread.sleep(100);
if (!fromSecondWord) SecondWord.writeSecondWord(true);
System.out.println("FirstWord end");
}
}
class SecondWord {
public static synchronized void writeSecondWord(boolean fromFirstWord) throws Exception {
System.out.println("SecondWord start");
Thread.sleep(100);
if (!fromFirstWord) FirstWord.writeFirstWord(true);
System.out.println("SecondWord end");
}
}
Как вы можете увидеть консоли шоу:
FirstWord start
SecondWord start
Первый поток "входит" в FirstWord
синхронизированного блока, а второй входит в SecondWord
один. Затем, немного спящий, первый поток пытается войти в метод SecondWord и должен ждать, потому что второй поток имеет блокировку для этого метода.
В то время как это происходит, второй поток также ждет, чтобы получить другой замок, и именно поэтому оба потока блокируют и никогда не достигают «конца», как они никогда не получают оба замка.
Если вы удалите Thread.sleep
в обоих методах, это может сработать. Как сказано, это непредсказуемо. Вы не можете знать, какой поток будет вводить первым.
что вы видите? –
Почему вы не можете выполнить и посмотреть! – LGAP
Домашнее задание много? – Gal