egisss633

MonitorJava

Jan 16th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.15 KB | None | 0 0
  1. 1.
  2. private int a;
  3. public synchronized void prideti(int x) {
  4. a = a + x;
  5. }
  6. public synchronized void atimti(int x) {
  7. a = a - x;
  8. }
  9. public synchronized void spausdinti() {
  10. System.out.println(a);
  11. }
  12. Kuomet parašoma synchronized, tuomet metodas elgiasi kaip monitorius – jis neleidžia daug gijų vienu
  13. metu redaguoti bendrą resursą.
  14. 2.
  15. private int a;
  16. public synchronized void prideti(int x) {
  17. try {
  18. while (a>=100)
  19. wait();
  20. } catch (InterruptedException e) {
  21. }
  22. a = a + x;
  23. notifyAll();
  24. }
  25. public synchronized void atimti(int x) {
  26. try {
  27. while (a<=0)
  28. wait();
  29. } catch (InterruptedException e) {
  30. }
  31. a = a - x;
  32. notifyAll();
  33. }
  34. try{} bloke aprašoma sąlyginė sinchronizacija. Čia gija laukia, kol norimas resursas pakis taip, kad galėtų
  35. toliau vykdyti savo dalį.
  36. notifyAll() pažadina visas gijas, kurioms reikia prieiti prie naujos reikšmės. Jeigu tokių nėra – nieko
  37. nedaroma.
  38. 3. Norint sudauginti matricą su vektoriumi lygiagrečiai, galima uždavinį padalinti į tiek dalių, kiek yra
  39. matricos stulpelių/vektoriaus eilučių. Kad būtų galima sandauga, reikia kad matricos stulpelių skaičius
  40. sutaptų su vektoriaus eilučių skaičiumi. Naudojant kanalus, siunčiamas sandaugos uždavinys Gavėjui.
  41. Kuomet jis ši uždavinį išsprendžia, persiunčia procesui, kuris gautus dalinius rezultatus sudeda į bendrą.
  42. 4. Skaitytojai – rašytojai. Lygiagretumo problema – kelių gijų bandymas prieiti prie resurso vienu metu.
  43. Problema kyla kuomet resursas pakeičiamas viduryje skaitymo ar rašymo. Jeigu skaitymo metu pakinta
  44. reikšmė, galutinis programos rezultatas taip pat gali pakisti. Dėl to reikia naudoti monitorius, kad tik
  45. viena gija galėtų atlikti veiksmus su tuo resursu.
  46. 5. Atominiai veiksmai (tokie kaip x++, ++x, x--, --x) dažniausiai įvykdomi labai greitai. Tačiau atominio
  47. veiksmu metu, vykdoma tik viena operacija visoje programoje (vykdo tik viena gija vienu metu). Dėl to
  48. lygiagreti programa, kurios metu vykdomi procesai P1, P2, P3, galima vykdymo seka yra tokia
  49. (priklausomai kuri gija anksčiau pradėjo darbą): v11, v21, v31 (bet kokia tvarka), tuomet v12, v22, v32
  50. (bet kokia tvarka).
Advertisement
Add Comment
Please, Sign In to add comment