Часть 1:вызов Синхронное внутри другого Синхронное
Предположим, следующий фрагмент кода
void method1(){
synchronized (lockObject){
method2();
System.out.println("line4");
}
}
void method2(){
System.out.println("line1");
synchronized (lockObject){
System.out.println("line2");
}
System.out.println("line3");
}
Это тупиковый? Это безопасный код? Будет ли выход всегда:
line1
line2
line3
line4
Часть 2:
Что делать, если method2() выполняется в другом потоке? Будет ли выход отличаться? Как это:
void method1(){
synchronized (lockObject){
method2();
System.out.println("line4");
}
}
void method2(){
newThread= new Thread(new Runnable() {
@Override
public void run() {
System.out.println("line1");
synchronized (lockObject){
System.out.println("line2");
}
System.out.println("line3");
}
}).start();
}
Я предполагаю, что выход второго кода может быть:
line4
line1
line2
line3
Правильно ли это?
попробуйте его и посмотрите. – MadConan
Я пробовал и наблюдал некоторые результаты ... Но информатика - это не наука, основанная на экспериментах! Если вы проводите тест 1000 раз и получаете тот же результат, вы не можете сказать, что результат действителен, если вы не знаете, что делает основной код. – Kasra
@ Kasra вы на 100% прав, тестирование ничего не доказывает с многопоточными проблемами, так как результат будет зависеть от порядка выполнения, и вам может повезти. – Zielu