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
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 .
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