2012-11-01 4 views
8

natknąłem dopiskiem w java.lang.Class.newInstance0() w JDK 1.7 Aktualizacja 7:Dlaczego java.lang.Class.newInstance0() nie jest dokładnie poprawna w modelu pamięci Java?

UWAGA: poniższy kod nie może być absolutnie poprawne w ramach obecnego modelu pamięci Java.

Czy ktokolwiek może wyjaśnić, dlaczego?

+0

Czy mógłbyś przytoczyć odpowiedni "poniższy kod"? – Vlad

+0

Znalazłem notatkę (dzięki Google) http://cr.openjdk.java.net/~jrose/7030453/webrev.00/raw_files/new/src/share/classes/java/lang/Class.java – Augusto

+0

rodzaj DCL? http://www.javaworld.com/jw-02-2001/jw-0209-double.html – Flot2011

Odpowiedz

5

Jedynym problemem w tym kodzie, że widzę to, że „cachedConstructor” pole jest niestabilna, a jednocześnie gwarantuje wartość efekt widoczności wśród wątków, ten konkretny blok kodu ma dziwactwo, że różne wątki widział cachedConstructor jako NULL przed wartością zostanie przypisany przez jeden z wątków, tzn. sekwencja inicjalizacyjna nie jest atomowa. Może to tylko doprowadzić do tego, że buforowana Konstruktor może być przypisana kilka razy jednocześnie, ale nie złamie kodu, jeśli nikt konkretnie nie powie, że będzie to ta sama instancja klasy Constructor. Jeśli bufor inicjalizujący bufor byłby zsynchronizowany, to będzie on atomowy, tzn. Buforowana Konstruktor zostanie przypisana tylko raz, niezależnie od warunków wyścigu.

Powiedziawszy, kod powinien działać poprawnie, ale pozwala na równoczesne nadmierne przeliczanie wartości z pamięci podręcznej przez więcej niż jeden wątek.

+0

Potem domyślam się, że autor komentarza powinien być nieco jaśniejszy w tej notatce. Dzięki za wytłumaczenie. – SpaceTrucker

1

obecny model pamięci Java

pytanie brzmi "jak prąd".

Ten fragment kodu jest prawdopodobnie bardzo stary, 1.4 lub wcześniejszy i nikt go nie dotykał.

Autor prawdopodobnie miał świadomość, że nad opracowywany jest nowy model pamięci.

Powiązane problemy