Pisze referencję na 64-bitowych maszynach wirtualnych

Model pamięci java nakazuje, że zapis int jest atomowy: to znaczy, jeśli napiszesz do niego wartość (składającą się z 4 bajtów) w jednym wątku i odczytasz ją w innym, otrzymasz wszystkie bajty lub żaden, ale nigdy 2 nowe bajty i 2 Stare bajty lub takie.

To nie jest gwarantowane dla long. W tym przypadku zapis {[2] } do zmiennej posiadającej 0 może spowodować odczytanie innego wątku 0x112233440000000 lub 0x0000000055667788.

Teraz specyfikacja nie nakazuje odwoływania się do obiektów albo int albo long-size. Ze względów bezpieczeństwa typu podejrzewam, że są one gwarantowane do zapisu atomicznego, ale na 64-bitowej maszynie wirtualnej te odniesienia mogą być bardzo dobrze wartościami 64-bitowymi (tylko adresy pamięci).

Oto moje pytania:

  • czy są jakieś specyfikacje modelu pamięci obejmujące To (których nie znalazłem)?
  • czy Long-writes suspect to be atomic na 64-bitowych maszynach wirtualnych?
  • Czy maszyny wirtualne są zmuszone do mapowania odniesień do 32bit?

Pozdrawiam, Steffen

Author: xav, 2010-04-05

1 answers

Czytanie/pisanie odwołań zawsze atomic

Patrz JLS sekcja 17.7: Nieatomiczna obróbka podwójnego i długiego

Dla potrzeb modelu pamięci języka programowania Java, a pojedynczy zapis do nieulotnej długiej lub podwójnej wartości jest traktowany jako dwa oddzielne zapisy: jedna do każdej 32-bitowej połowy. Może to spowodować sytuacja, w której wątek widzi pierwsze 32 bity 64-bitowej wartości z jeden zapis, a drugi 32 bity z drugiego zapisu.

Zapis i odczyt lotnych długich i podwójnych wartości są zawsze atomowe.

Zapisy i odczyty odwołań są zawsze atomowe, niezależnie od niezależnie od tego, czy są one implementowane jako wartości 32-bitowe, czy 64-bitowe.

Niektóre implementacje mogą uznać za wygodne dzielenie pojedynczego zapisu akcja na 64-bitowej długiej lub podwójnej wartości na dwie akcje zapisu na sąsiadujące wartości 32-bitowe. Ze względu na efektywność, takie zachowanie jest implementacja-specyficzna; realizacja Java Virtual Machine jest wolny do wykonywania zapisów do długich i podwójnych wartości atomicznie lub w dwie części.

Implementacje wirtualnej maszyny Java są zachęcane do unikania dzielenie 64-bitowych wartości tam, gdzie to możliwe. Programiści są zachęcani do deklarują wspólne wartości 64-bitowe jako zmienne lub synchronizują swoje programy prawidłowo, aby uniknąć możliwych komplikacji.

(podkreślenie dodane)

AtomicReference

Jeśli chcesz koordynować stare i nowe wartości, lub chcesz konkretnych efektów pamięci, Użyj klasy AtomicReference.

Na przykład, AtomicReference::getAndSet zwraca starą wartość podczas ustawiania nowej wartości atomicznie, eliminując ryzyko, że inny wątek interweniuje między tymi dwoma krokami. Zastosowania volatile semantyka pamięci .

 60
Author: Dirk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-12 20:42:38