Читать полевое значение поля после строительства объектаJAVA

Программисты JAVA общаются здесь
Anonymous
Читать полевое значение поля после строительства объекта

Сообщение Anonymous »

Я читаю книгу «Параллелизм Java на практике» Брайана Гетца. Параграфы 3.5 и 3.5.1 содержат операторы, которые я не могу понять. < /P>
Рассмотрим следующий код: < /p>
public class Holder {
private int value;
public Holder(int value) {
this.value = value;
}

public void assertValue() {
if (value != value) throw new AssertionError("Magic");
}
}

class HolderContainer {
// Unsafe publication
public Holder holder;

public void init() {
holder = new Holder(42);
}
}
< /code>
Автор гласит, что: < /p>
  • В Java конструктор объекта сначала записывает значения по умолчанию ко всем полям перед запуском подкласса. Современное значение в следующий раз, поэтому Assertn может бросить AssertionError. и в следующем моменте значение = 42. < /p>
    Я согласен с точкой 1, что конструктор объекта сначала заполняет поля со значениями по умолчанию. Но я не понимаю баллов 2 и 3.public class Holder {
    int value;

    public Holder(int value) {
    //Sleep to prevent constructor to finish too early
    try {
    Thread.sleep(3000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    this.value = value;
    }

    public void assertValue() {
    if(value != value) System.out.println("Magic");
    }
    }
    < /code>
    Я добавил Thread.sleep (3000), чтобы заставить поток подождать, прежде чем объект будет полностью построен. < /p>
    public class Tests {

    private HolderContainer hc = new HolderContainer();

    class Initialization implements Runnable {
    public void run() {
    hc.init();
    }
    }

    class Checking implements Runnable {
    public void run() {
    hc.holder.assertValue();
    }
    }

    public void run() {
    new Thread(new Initialization()).start();
    new Thread(new Checking()).start();
    }
    }
    < /code>
    В примере: < /p>

    Первый поток Inits Holder Object < /li>
    Вызовы второго потока AssertValue < /li>
    < /ol>
    Основные потоки запускают два потока: < /p>

    news (. Полностью построить объект держателя займет 3 секунды < /li>
    New Thread (New Cecking ()). Start (); Поскольку объект Holder по -прежнему не построенный код выбросит NullPointerException < /strong> < /li>
    < /ol>
    Следовательно, невозможно подражать ситуации, когда поле имеет значение по умолчанию. эмулировать поведение для поля значений по умолчанию?


Подробнее здесь: https://stackoverflow.com/questions/506 ... nstruction

Вернуться в «JAVA»