Я начал углубленно изучать потоки и, пытаясь понять концепции, я написал следующий код, и я не уверен в выводе кода. Следующий код, который я написал,
public class UnsafeCheck extends Thread {
private static Person person;
// This method is not thread safe without synchronization. Make the method
// synchronized to make the code thread safe.
public synchronized Person getPerson() {
if(person == null) {
System.out.println("Inside if block");
person = new Person("Kilarapu Yethendra", 27);
}
return person;
}
public void run() {
System.out.println("thread's run method");
getPerson();
}
public static void main(String[] args) {
UnsafeCheck uc = new UnsafeCheck();
uc.start();
UnsafeCheck uc1 = new UnsafeCheck();
uc1.start();
UnsafeCheck uc2 = new UnsafeCheck();
uc2.start();
}
}
Выходные данные:
thread's run method
Inside if block
thread's run method
Inside if block
thread's run method
Inside if block
Если мы наблюдаем, что выходные изменения, внесенные потоком uc, не отражаются в потоке uc1, поэтому для каждого элемента управления потоком идет блок if.Я ожидал, что ссылка на person будет инициализирована, когда uc1 выполняет метод run, но person по-прежнему равен null для потока uc1.
Еще одно интересное наблюдение, которое я сделал, заключалось в том, что если я сделаю метод getPerson () статическим, я будуполучить результат, как и ожидалось.Ниже приведен вывод, когда метод getPerson () является статическим.
Вывод:
thread's run method
Inside if block
thread's run method
thread's run method.
Пожалуйста, помогите мне понять поток.