Java:Vlákna: Porovnání verzí

Z FI WIKI
Přejít na: navigace, hledání
(kdy není nutné synchronizovat?)
(přidán odkaz na PV168/Vlákna)
Řádka 1: Řádka 1:
 +
Podrobněji viz heslo [[PV168/Vlákna]].
 +
 
== VLÁKNA ==
 
== VLÁKNA ==
na vlákna obecně dávat pozor
+
 
 +
Na vlákna obecně dávat pozor
 
* jeden proces může mít víc vláken
 
* jeden proces může mít víc vláken
 
* chování plánovače vláken nelze předvídat - špatně se odhadují chyby v synchronizaci
 
* chování plánovače vláken nelze předvídat - špatně se odhadují chyby v synchronizaci

Verze z 7. 4. 2008, 11:50

Podrobněji viz heslo PV168/Vlákna.

VLÁKNA

Na vlákna obecně dávat pozor

  • jeden proces může mít víc vláken
  • chování plánovače vláken nelze předvídat - špatně se odhadují chyby v synchronizaci
  • viceprocesorove systemy - problem s vyrovnavaci pameti, moznost ulozit jednu promennou do vice pameti

synchronizace

  • zajištění komunikace mezi vlákny
  • umožňuje, aby si vlákna "nelezla do zelí"
  • zámek - základní typ synchronizačního prostředku
  • není dobré v aplikaci používat příliš mnoho vláken, proto se pouažívá technika nazývaná pooling = snaha o rozdělování práce mezi již existující vlákna, namísto vytváření vláken pro každou novou úlohu

vytvoření vlákna

  • třída Thread
  • rozhraní Runnable
  • implementovat metodu Run (vytvořit potomka třídy Thread s překrytou metodou Run)
  • vlákno spoštět pomocí metody start(), ne pomocí run() !!! Voláním metody run() se kód této metody provede ve vláknu, které tuto metodu volá, nevytvoří se nové vlákno.
  • pool vláken: umožňuje sdílet prostředky mezi vlákny/procesy
  • je vhodné používat java.util.concurrent
  • pokud chci při spolupráci více vláken zastavit nějaké jiné vlákno,

udělám to přes nějaký "flag", který si každé vlákno kontroluje v průběhu své práce

  • nutná dokumentace přístupu k vláknum

AtomicBoolean - použití při zastavení vláken

Monitor

  • chrání nějaký objekt, který má kritické sekce
  • nedovolí, aby víc vláken "vlezlo" do nějaké kritické sekce hlídané jedním monitorem
  • metoda hlídaná monitorem se nazývá Synchronized
  • synchronizace části metody:

synchronize(0)

  • 0...obsahuje synchronizovanou metodu

Použití monitoru

  • Synchronizace celé metody. Jestliže jsou dvě metody jedné třídy synchronizované, potom nemohou běžet ve dvou vláknech současně (na jedné instanci). Pro synchronizaci se využije mutex daného objektu.
 synchronized public void delejNeco();
  • Synchronizace části metody:
 synchronized(ob) { // kritická sekce  } 
  • Využije se zámek objektu ob

Atomické operace

  • Atomická operace je operace, která se provede buď celá, anebo vůbec
  • mezi tyto operace patří čtení a zápis hodnoty typu byte, short, int, char, float, boolean a Object
  • nepatří sem double a long
  • atomická operace jenom a pouze zaručí vláknu, že v dané proměnné neuvidí při čtení nesmyslnou hodnotu (mezivýsledek). Nic jiného!!!!
  • Když provedu atomickou operaci v jednom vláknu, změna se nemusí projevit okamžitě. Díky různým optimalizacím se nemusí dokonce projevit do ukončení programu!!!
  • řešením je modifikátor volatile (zakáže určité optimalizace), ale ten na víceprocesorových systémech nepracuje spolehlivě
  • to, že je operace atomická, neznamená, že nemusím synchronizovat!!!
  • pro synchronizované atomické operace se doporučuje využít balík java.util.concurent.atomic
 AtomicInteger, AtomicFloat, ...

kdy není nutné synchronizovat?

  • existuje jen 1 vlákno
  • existují jen neměnné objekty
  • synchronizuje se na vyšší úrovni
  • neměníme data v žádném jiném vlákně
  • podstatná otázka u vláken je VÝKON aplikace
  • aplikace skončí až tehdy, když doběhnou všechna nedémonová vlákna, vlákno se může stát deamonem zavoláním metody setDaemon třídy Thread
  • pro zastavení vlákna nepoužívat metodu stop()
  • dobré poznámky k vláknům v knize Java Efektivně