Javassa synkronointi on ratkaisevan tärkeää samanaikaisessa ohjelmoinnissa, kun useat säikeet käyttävät jaettuja resursseja. Se varmistaa, että vain yksi säie käyttää kriittistä osaa kerrallaan, mikä estää tietojen epäjohdonmukaisuuden. Synkronointia voidaan soveltaa menetelmiin tai koodilohkoihin. Menetelmä vs. lohkosynkronointi
kirjoita json tiedostoon python
Synkronoinnin tyypit
- Synkronointimenetelmä: Lukitsee koko menetelmän varmistaakseen, että vain yksi säie suorittaa sen kerrallaan.
- Estä synkronointi: Lukitsee vain koodin kriittisen osan menetelmässä.
Synkronointi vaaditaan muuttuville objekteille, joita käytetään useilla säikeillä. Muuttumattomat objektit tai vain luku -oikeudet eivät vaadi synkronointia.
Menetelmän synkronointi
Synkronoi menetelmä lisäämällä synkronoitu avainsana. Tämä varmistaa, että vain yksi säie voi suorittaa menetelmän kerrallaan.
Esimerkki 1: Synkronoitumaton menetelmä
Javaclass Line { public void getLine() { for (int i = 0; i < 3; i++) { System.out.println(i); try { Thread.sleep(100); } catch (Exception e) { System.out.println(e); } } } } class Train extends Thread { Line line; Train(Line line) { this.line = line; } public void run() { line.getLine(); } } public class Geeks { public static void main(String[] args) { Line obj = new Line(); Train t1 = new Train(obj); Train t2 = new Train(obj); t1.start(); t2.start(); } }
Lähtö
0 0 1 1 2 2
Selitys: Säikeet t1 ja t2 käyttävät menetelmää samanaikaisesti aiheuttaen sekatuloksen.
Esimerkki 2: Synkronoitu menetelmä
Javaclass Line { synchronized public void getLine() { for (int i = 0; i < 3; i++) { System.out.println(i); try { Thread.sleep(100); } catch (Exception e) { System.out.println(e); } } } } class Train extends Thread { Line line; Train(Line line) { this.line = line; } public void run() { line.getLine(); } } public class Geeks { public static void main(String[] args) { Line obj = new Line(); Train t1 = new Train(obj); Train t2 = new Train(obj); t1.start(); t2.start(); } }
Lähtö
0 1 2 0 1 2
Selitys: Vain yksi säie suorittaa menetelmän kerrallaan varmistaakseen tietojen johdonmukaisuuden.
Estä synkronointi
Lohkosynkronointia käytetään, kun vain osa menetelmästä sisältää kriittistä koodia. Tämä parantaa suorituskykyä sallimalla säikeiden suorittaa ei-kriittistä koodia samanaikaisesti.
hashset java
Esimerkki: Synkronoitu lohko
Javaimport java.util.*; class Geek { String name = ''; public int count = 0; public void geekName(String geek List<String> list) { synchronized(this) { name = geek; count++; } list.add(geek); } } public class GFG { public static void main(String[] args) { Geek gk = new Geek(); List<String> list = new ArrayList<>(); gk.geekName('Mohit' list); System.out.println(gk.name); } }
Lähtö
Mohit
Selitys: Vain lohkon päivityksen nimi ja määrä synkronoidaan. Nimien lisääminen luetteloon tapahtuu samanaikaisesti.
Menetelmä vs lohkosynkronointi
| Ominaisuus | Menetelmän synkronointi | Estä synkronointi |
|---|---|---|
| Laajuus | Lukitsee koko menetelmän | Lukitsee vain tietyn koodilohkon |
| Suorituskyky | Voi aiheuttaa tarpeettoman eston ei-kriittiselle koodille | Tehokkaammin vain kriittiset osat synkronoidaan |
| Lukko | Hanki lukon menetelmän objektiin | Saa lukon lohkossa määritettyyn objektiin tai luokkaan |
| Joustavuus | Vähemmän joustava koko menetelmä on lukittu | Joustavampi mahdollistaa valikoivan synkronoinnin |
Tärkeitä kohtia
- Synkronoituun menetelmään/lohkoon saapuva säie saa lukon ja vapauttaa sen poistuessaan.
- Ilmentymän menetelmät/lohkot: Hanki objektitason lukitus.
- Staattiset menetelmät/lohkot: Hanki luokkatason lukitus.
- Nollaobjektien synkronointi aiheuttaa NullPointerExceptionin.
- wait() notify() ja notifyAll() ovat avainmenetelmiä synkronoinnissa.
- Vältä ei-lopullisten kenttien synkronointia, jotta säikeet eivät lukitse eri objekteja.
- synkronoitua avainsanaa ei voi soveltaa muuttujiin.
Edut
- Varmistaa jaettujen resurssien vastavuoroisen poissulkemisen monisäikeisissä ohjelmissa.
- Sekä synkronoitu ilmentymä että staattiset menetelmät voivat toimia samanaikaisesti, koska ne lukitsevat eri objekteja.
Rajoitukset
- Estää samanaikaisia lukuja rajoittamasta samanaikaisuutta.
- Synkronoidut menetelmät voivat heikentää suorituskykyä. Suosi lohkosynkronointia vain kriittisille osille.