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] .
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í.
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 ).
„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í):
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] .
Jáva | |
---|---|
Platformy | |
Sun Technologies | |
Klíčové technologie třetích stran | |
Příběh |
|
Vlastnosti jazyka | |
Skriptovací jazyky |
|
Java konference |
|