Sinhronizacija v Javi: Kaj, kako in zakaj?



Ta članek o sinhronizaciji v Javi vam bo pomagal pri spoznavanju sinhronizacije večnitnih programov.

Večnitni programi se lahko redno pojavljajo v okoliščinah, ko je več poskusiti priti do istega vira, ki daje lažne in osupljive rezultate. To lahko rešite s sinhronizacijo v Javi. Samo ena posebna nit lahko v določenem času pride do vira. Ta članek vam bo pomagal, da se seznanite s strategijo sinhronizacije.

kako deluje tostring v javi -

O temah bom razpravljal v tem vrstnem redu:





Začnimo!

Zakaj uporabljati sinhronizacijo v Javi?



Če začnete z vsaj dvema nitima znotraj programa, obstaja možnost, da več niti poskuša priti do istega vira. Zaradi težav s sočasnostjo lahko povzroči celo nepričakovan izid.

Sintaksa :

sinhronizirano (objectidentifier) ​​{// Dostop do spremenljivk v skupni rabi in drugih virov v skupni rabi}

Na primer, poskus pisanja v enakovredno datoteko. To lahko poškoduje podatke, saj lahko ena od niti preglasi podatke ali ko nit odpre datotekoisto datoteko hkrati, druga nit morda zapira isto datoteko.Treba je sinhronizirati delovanje več niti. To lahko izvedemo s pomočjo koncepta, imenovanega M onitorji .



  • Vsak je povezan z monitorjem, ki ga nit lahko zaklene ali odklene.
  • Samo ena nit naenkrat lahko zaklene monitor.
  • Java programski jezik ponuja zelo priročen način ustvarjanja niti in sinhronizacije njihovih nalog z uporabo Sinhronizirano bloki.
  • V tem bloku hrani tudi skupne vire.

Sinhronizirani bloki v Javi so označeni z Sinhronizirano ključna beseda. Ta blok v Javi je sinhroniziran na nekem objektu.Vsi bloki, ki so sinhronizirani na istem objektu, imajo lahko v sebi izvedeno samo eno nit hkrati. Vse druge niti, ki poskušajo vstopiti v sinhronizirani blok, so blokirane, dokler nit znotraj sinhroniziranega bloka ne zapusti bloka.

Vrste sinhronizacije

Na voljo sta v bistvu dve vrsti sinhronizacije. To so:

  1. Sinhronizacija procesa: Hkratno izvajanje več niti ali procesov, da se doseže takšno stanje, da se zavežejo k določenemu zaporedju dejanj.
  2. Sinhronizacija niti: V časih, ko je več nitiposkuša dostopati do vira v skupni rabi, morate zagotoviti, da bo vir uporabljala samo ena nit naČas.

Ne spuščamo se podrobnosti teh vrst in poskušajmo razumeti, kaj so ključavnice .

Zaklepanje v Javi

Kot sem že omenil, je sinhronizacija zgrajena okoli notranje entitete, imenovane zaklepanje ali monitor . Vsak predmet ima s seboj povezano ključavnico. Torej mora nit, ki potrebuje dosleden dostop do polj predmeta, pridobiti ključavnico predmeta, preden dostopi do njih, in jo nato sprostiti, ko je delo končano.

Iz Jave 5 paket java.util.concurrent.locks vsebuje veliko izvedb zaklepanja.

Takole je videti ključavnica:

javni razred Lock {private boolean isLocked = false javna sinhronizirana void lock () vrže InterruptedException {while (isLocked) {wait ()} isLocked = true} javno sinhronizirano void unlock () {isLocked = false notify ()}}

Metoda lock () zaklene primerek Lock, tako da so vse niti, ki kličejo lock (), blokirane, dokler se ne izvede unlock ().

Večnitni navoji brez sinhronizacije

Tu je preprost primer, ki v zaporedju natisne vrednost števca in vsakič, ko ga zaženemo, na podlagi razpoložljivosti procesorja v nit da drugačen rezultat. Poglej to!

razred Multithread {public void printCount () {try {for (int i = 5 i<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }

Rezultati zgornjega programa v tem:

Izhod- Sinhronizacija v Javi- Edureka

Večnitnost s sinhronizacijo

To je isti primer kot zgoraj, vendar v zaporedju natisne vrednost števca. Vsakič, ko ga zaženemo, da enak rezultat.

končno končno dokončanje v javi
class Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Izjema e) {System. out.println ('Nit prekinjena.')}}} razred Nit se razteza Multithread {private Thread t private String threadName Multithread MT Thread (String name, Multithread mt) {threadName = name MT = mt} public void run () {sinhronizirano ( MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'exiting.')} Public void start () {System.out.println ('Starting' + threadName) if (t == null) {t = new Thread (this, threadName) t.start ()}}} javni razred TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = new Thread ('Thread - 1 ', MT) Nit T1 = nova nit (' Nit - 2 ', MT) T.start () T1.start () // počakajte, da se niti končajo in poskusite {T.join () T1.join ()} catch (izjema e) {System.out.println ('Prekinjeno')}}}

Rezultat je prikazan spodaj:

Sinhronizirana ključna beseda

sinhronizirana ključna beseda označi blok ali metodo kritični odsek. Kritični odsek je, kjer se naenkrat izvaja samo ena nit, nit pa ima ključavnico za sinhronizirani odsek. To sinhronizirano ključna beseda pomaga pri pisanju sočasno deli katere koli aplikacije. Prav tako ščiti skupne vire znotraj bloka.

Sinhronizirano ključno besedo lahko uporabljate z:

Pogovorimo se o bloku kode.

Sinhronizirana ključna beseda: blok kode

Sintaksa

Splošna sintaksa za pisanje sinhroniziranega bloka je:

synchronized (lockObject) {// sinhronizirani stavki}

Ko hoče nit izvajati sinhronizirane stavke znotraj bloka, mora pridobiti ključavnico na monitorju lockObject. Naenkrat lahko nadzornik predmeta zaklepanja pridobi samo ena nit. Torej morajo vse druge niti počakati, da trenutno izvedena nit pridobi ključavnico in dokončati njeno izvajanje.
Na ta način sinhronizirano ključna beseda zagotavlja, da bo sinhronizirane stavkovne bloke naenkrat izvajala samo ena nit in tako preprečuje, da bi več niti poškodovalo skupne podatke, ki so prisotni v bloku.

Opomba :

  • Če nit zaspimo (z uporabo spanje () metoda), potem ne sprosti ključavnice. V tem času mirovanja nobena nit ne bo izvajala sinhroniziranih stavkov blokov.
  • Sinhronizacija Java bo vrgla NullPointerException če je predmet zaklepanja uporabljen v sinhronizirano (zaklepanje) 'Je nič.

Zdaj pa se pogovorimo o metodi.

Sinhronizirana ključna beseda: Metoda

Sintaksa

Splošna sintaksa za pisanje a sinhronizirana metoda je:

sinhronizirana metoda (parametri) {// sinhronizirana koda}

Tukaj lockObject je le sklic na objekt, katerega zaklepanje je povezano z monitorjem, ki predstavlja sinhronizirane stavke.

Podobno kot pri sinhroniziranem bloku mora nit tudi s sinhronizirano metodo pridobiti zaklep na povezanem nadzornem objektu. V primeru sinhronizirane metode je objekt zaklepanja:

ustvari niz predmetov
  • Objekt .class - če je dana metoda statična .
  • 'Ta' predmet - če je metoda nestatična . 'To' je sklic na trenutni objekt, v katerem je priklicana sinhronizirana metoda.

Sinhronizirana ključna beseda Java je ponovno udeleženec v naravi. To pomeni, da če sinhronizirana metoda pokliče drugo sinhronizirano metodo, ki zahteva isto ključavnico, lahko trenutna nit, ki drži ključavnico, vstopi v to metodo brez pridobitve ključavnice.

Pojdimo naprej do zadnje teme tega članka in opozorimo na glavne razlike med sinhronizirano ključno besedo in sinhronizacijskim blokom.

Razlika med sinhronizirano ključno besedo in sinhroniziranim blokom

  • Ko uporabljate sinhronizirano ključno besedo z metoda , pridobi ključavnico v predmetu za celotno metodo. To pomeni, da nobena druga nit ne more uporabljati nobene sinhronizirane metode, dokler trenutna nit, ki je priklicana, ne zaključi izvajanja.
  • Sinhronizirano blok pridobi ključavnico v objektu le med oklepaji, potem ko je podana sinhronizirana ključna beseda. To pomeni, da nobena druga nit ne more zakleniti že zaklenjenega predmeta, dokler blok ne zapusti. Toda druge niti bodo lahko dostopale do preostale kode, ki je prisotna v metodi.

To nas pripelje do konca tega članka, kjer smo razpravljali o tem, kako natančno deluje sinhronizacija v Javi. Upam, da ste na jasnem z vsem, kar je bilo v tej vadnici dano v skupno rabo z vami.

Oglejte si Edureka, zaupanja vredno podjetje za spletno učenje z mrežo več kot 250.000 zadovoljnih učencev, ki se širijo po vsem svetu. Tu smo, da vam pomagamo pri vsakem koraku na poti, saj smo poleg tega vprašanja za java intervjuji pripravili učni načrt, ki je zasnovan za študente in strokovnjake, ki želijo biti razvijalec Java.

Imate vprašanje za nas? Prosimo, omenite ga v oddelku za komentarje tega »Sinhronizacija v Javi ' članek in se vam bomo javili v najkrajšem možnem času.