Model paměti Java

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 16. července 2022; ověření vyžaduje 1 úpravu .

Java Memory Model ( JMM ) popisuje chování vláken v běhovém prostředí Java .  Paměťový model je součástí sémantiky jazyka Java a popisuje, co může a co by neměl programátor očekávat při vývoji softwaru nikoli pro konkrétní stroj Java, ale pro Javu jako celek.

Původní model paměti Java (který zahrnuje zejména "perkolokální paměť") vyvinutý v roce 1995 je považován za selhání: mnoho optimalizací nelze provést bez ztráty záruky bezpečnosti kódu. Zejména existuje několik možností, jak psát vícevláknový " jednoručně ": [1]

J2SE 5.0 (30. září 2004) představil nový model paměti vyvinutý prostřednictvím Java Community Process nazvaný JSR-133 [2] [3] . Lépe odráželo, jak fungují moderní procesory a kompilátory, a další jazyky převzaly nápady z modelu Java. Hlavními příspěvky k jeho vytvoření byli Sarita Adwe , Jeremy Mason a Bill Pugh [4] .

Pozadí

Programovací jazyk Java umožňuje psát programy s více vlákny. Protože Java může běžet na široké škále procesorů a operačních systémů, je synchronizace vláken obzvláště obtížná. Aby mohl programátor vyvodit nějaké závěry o chování programů, rozhodli se vývojáři Javy jasně definovat různé chování všech programů v Javě.

Na moderních počítačích se kód kvůli rychlosti nespouští v pořadí, v jakém je zapsán. Permutaci provádí kompilátor, procesor a paměťový subsystém. Na víceprocesorových počítačích může mít každé jádro svou vlastní mezipaměť , která není synchronní s hlavní pamětí. To znamená, že různé procesory mohou mít různé hodnoty stejné proměnné současně. Když vlákna mezi sebou hodně interagují, je to obvykle nežádoucí: trvá hodně času, než se udrží krok s tím, co udělal druhý procesor.

Navíc v jednovláknovém prostředí stačí po systému vyžadovat „pseudosekvenční“ spouštění programu – pozorovateli, který vidí pouze I/O , se bude zdát, že všechny akce jsou prováděny v pořadí, v jakém se v programu objevily, i když nejsou. Každý, kdo se však může „podívat“ do paměti počítače – včetně dalšího vlákna – všechny tyto „finty“ zaznamená. Zvažte dvě vlákna, která současně provádějí takový kód ( xa yzpočátku nuly).

Stream 1 Stream 2
x = 1; int r1 = y;
y=2; int r2 = x;

Pokud neexistují žádné permutace a vlákno 2 čte y=2, je zaručeno, že to bude x=1: koneckonců zápis do xse provádí před zápisem do y. S permutací se ukazuje jako možná zdánlivě paradoxní situace: r1=2, r2=0.

JMM umožňuje toto chování vícevláknových programů, ale popisuje, kdy jsou takové permutace možné. Paměťový model Java tedy ukládá omezení na interakci vláken, aby nepřišly o možné optimalizace a zároveň umožnily vícevláknovým programům chovat se spolehlivě a předvídatelně tam, kde je to potřeba. Programátor může učinit jakékoli závěry o pořadí, ve kterém je kód vykonáván na vícevláknovém stroji, a to i přes optimalizace provedené kompilátorem, procesorem a mezipamětí.

Model paměti

Pravidlo #1: Jednovláknové programy běží pseudosekvenčně. To znamená: ve skutečnosti může procesor provádět několik operací za takt, současně měnit jejich pořadí, nicméně všechny datové závislosti zůstávají zachovány, takže chování se neliší od sekvenčního.

Pravidlo číslo 2: neexistují žádné z ničeho nic hodnoty. Čtení libovolné proměnné (kromě non- volatile longa double, pro které toto pravidlo nemusí platit) vrátí buď výchozí hodnotu (nulu), nebo něco, co je tam zapsáno jiným příkazem.

A pravidlo číslo 3: ostatní události jsou provedeny v pořadí, pokud jsou spojeny přísným vztahem částečného příkazu „je provedeno před“ ( anglicky  se stane před ).

"Spustit před"

„Happens before“ ( anglicky  se stane před ) je striktní vztah částečného řádu (antireflexivní, antisymetrický, tranzitivní) zavedený mezi atomické příkazy ( ++a --nikoli atomické), vynalezený Leslie Lamportem a neznamená „fyzicky dříve“. Znamená to, že druhý tým bude „vědět“ o změnách, které provedl první tým.

Zejména se u takových operací provádí jedna před druhou (seznam není vyčerpávající):

Vliv

Vzhledem k rozsáhlému zavádění vícevláknových a paralelních systémů byla vyžadována sada nástrojů s jasnou sémantikou. Paměťový model Java byl prvním pokusem o vývoj komplexního modelu komunikace mezi vlákny pro hlavní programovací jazyk [9] .

V C++03 je jedinou poznámkou o multithreadingu to, že volatile-variables nemají žádné optimalizace rychlosti přístupu. To také nestačilo k využití plného výkonu přeskupujícího kompilátoru / procesoru a neobjevila se chyba související s provedením některého příkazu mimo pořadí. Podobný model paměti byl obsažen v C++11 [10] .

Viz také

Poznámky

  1. Prohlášení „Double-Checked Locking is Broken“ . Získáno 21. července 2013. Archivováno z originálu 6. března 2012.
  2. 1 2 Goetz, Brian Fixing the Java Memory Model, Part 2 (downlink) (24. února 2004). Získáno 18. října 2010. Archivováno z originálu 8. ledna 2007. 
  3. Jeremy Manson a Brian Goetz. JSR 133 (Java Memory Model) FAQ (únor 2004). — « Java Memory Model popisuje, jaké chování je legální ve vícevláknovém kódu a jak mohou vlákna interagovat prostřednictvím paměti. Popisuje vztah mezi proměnnými v programu a nízkoúrovňovými detaily jejich ukládání a načítání do az paměti nebo registrů ve skutečném počítačovém systému. Dělá to způsobem, který lze správně implementovat pomocí široké škály hardwaru a široké škály optimalizací kompilátoru. ". Datum přístupu: 18. října 2010. Archivováno z originálu 4. září 2013.
  4. James Gosling, Bill Joy, Guy L. Jr. Steele, Gilad Bracha, Alex Buckley. Specifikace jazyka Java, vydání Java SE 7. - Pearson Education, 2013. - ISBN 978-0-13-326032-8 .
  5. Synchronizace a model paměti Java . Získáno 21. července 2013. Archivováno z originálu 11. května 2013.
  6. The JSR-133 Cookbook (downlink) . Získáno 18. července 2013. Archivováno z originálu dne 25. září 2013. 
  7. Nikde, kromě konstruktoru, finalnemůžete zapisovat do -fields.
  8. >pracovní poznámky: Záruky pro finální pole . Získáno 22. července 2013. Archivováno z originálu 16. ledna 2015.
  9. Goetz, Brian Fixing the Java Memory Model, Part 1 (downlink) (24. února 2004). Získáno 17. února 2008. Archivováno z originálu 13. srpna 2009. 
  10. Boehm, Hans Threads a paměťový model pro C++ (downlink) . Datum přístupu: 17. února 2008. Archivováno z originálu 4. září 2013. 

Odkazy