logo

Sincronizare în Java

Programele cu mai multe fire pot ajunge adesea într-o situație în care mai multe fire încearcă să acceseze aceleași resurse și în cele din urmă produc rezultate eronate și neprevăzute.

De ce să folosiți sincronizarea Java?

Sincronizarea Java este folosită pentru a vă asigura, printr-o metodă de sincronizare, că doar un fir poate accesa resursa la un moment dat.

aruncați gestionarea excepțiilor în java

Blocuri sincronizate Java

Java oferă o modalitate de a crea fire și de a sincroniza sarcinile acestora folosind blocuri sincronizate.



Un bloc sincronizat în Java este sincronizat pe un obiect. Toate blocurile sincronizate se sincronizează pe același obiect și pot avea doar un fir executat în interiorul lor la un moment dat. Toate celelalte fire care încearcă să intre în blocul sincronizat sunt blocate până când firul din interiorul blocului sincronizat iese din bloc.

Notă: Blocurile sincronizate în Java sunt marcate cu cuvântul cheie sincronizat.

Forma generală a blocului sincronizat

// Only one thread can execute at a time. // sync_object is a reference to an object // whose lock associates with the monitor . // The code is said to be synchronized on // the monitor object synchronized(sync_object) { // Access shared variables and other // shared resources }>

Această sincronizare este implementată în Java cu un concept numit monitoare sau încuietori. Doar un fir poate deține un monitor la un moment dat. Când un fir capătă o blocare, se spune că a intrat pe monitor. Toate celelalte fire care încearcă să intre în monitorul blocat vor fi suspendate până când primul fir iese din monitor.

Tipuri de sincronizare

Există două sincronizări în Java menționate mai jos:

  1. Sincronizarea proceselor
  2. Sincronizarea firelor

1. Sincronizarea proceselor în Java

Sincronizarea proceselor este o tehnică utilizată pentru a coordona execuția mai multor procese. Se asigură că resursele partajate sunt în siguranță și în ordine.

2. Sincronizarea firelor în Java

Sincronizarea firelor este folosită pentru a coordona și ordona execuția firelor într-un program cu mai multe fire. Există două tipuri de sincronizare a firelor menționate mai jos:

  • Exclusiv reciproc
  • Cooperare (comunicare inter-thread în Java)

Exclusiv reciproc

Exclusivitatea reciprocă ajută la prevenirea interferențelor firelor între ele în timpul partajării datelor. Există trei tipuri de exclusivitate reciprocă menționate mai jos:

  • Metoda sincronizata.
  • Bloc sincronizat.
  • Sincronizare statică.

Exemplu de sincronizare

Mai jos este implementarea Sincronizării Java:

Java

centrarea unei imagini în css




// A Java program to demonstrate working of> // synchronized.> import> java.io.*;> import> java.util.*;> // A Class used to send a message> class> Sender {> >public> void> send(String msg)> >{> >System.out.println(>'Sending '> + msg);> >try> {> >Thread.sleep(>1000>);> >}> >catch> (Exception e) {> >System.out.println(>'Thread interrupted.'>);> >}> >System.out.println(>' '> + msg +>'Sent'>);> >}> }> // Class for send a message using Threads> class> ThreadedSend>extends> Thread {> >private> String msg;> >Sender sender;> >// Receives a message object and a string> >// message to be sent> >ThreadedSend(String m, Sender obj)> >{> >msg = m;> >sender = obj;> >}> >public> void> run()> >{> >// Only one thread can send a message> >// at a time.> >synchronized> (sender)> >{> >// synchronizing the send object> >sender.send(msg);> >}> >}> }> // Driver class> class> SyncDemo {> >public> static> void> main(String args[])> >{> >Sender send =>new> Sender();> >ThreadedSend S1 =>new> ThreadedSend(>' Hi '>, send);> >ThreadedSend S2 =>new> ThreadedSend(>' Bye '>, send);> >// Start two threads of ThreadedSend type> >S1.start();> >S2.start();> >// wait for threads to end> >try> {> >S1.join();> >S2.join();> >}> >catch> (Exception e) {> >System.out.println(>'Interrupted'>);> >}> >}> }>

înlocuiți din șir în java

>

>

Ieșire

Sending Hi Hi Sent Sending Bye Bye Sent>

Ieșirea este aceeași de fiecare dată când rulăm programul.

Explicaţie

În exemplul de mai sus, alegem să sincronizăm obiectul Sender în cadrul metodei run() a clasei ThreadedSend. Alternativ, am putea defini întregul bloc send() ca sincronizat , producand acelasi rezultat. Apoi, nu trebuie să sincronizăm obiectul Message în cadrul metodei run() din clasa ThreadedSend.

// An alternate implementation to demonstrate // that we can use synchronized with method also. class Sender { public synchronized void send(String msg) { System.out.println('Sending	' + msg); try { Thread.sleep(1000); } catch (Exception e) { System.out.println('Thread interrupted.'); } System.out.println('
' + msg + 'Sent'); } }>

Nu trebuie să sincronizăm întotdeauna o metodă întreagă. Uneori este de preferat sincroniza doar o parte a unei metode . Blocurile sincronizate Java din interiorul metodelor fac acest lucru posibil.

// One more alternate implementation to demonstrate // that synchronized can be used with only a part of // method class Sender { public void send(String msg) { synchronized(this) { System.out.println('Sending	' + msg ); try { Thread.sleep(1000); } catch (Exception e) { System.out.println('Thread interrupted.'); } System.out.println('
' + msg + 'Sent'); } } }>

Exemplu de metodă sincronizată prin utilizarea unei clase anonime

Java


șir în java boolean



înlocuirea metodei java
// Java Pogram to synchronized method by> // using an anonymous class> import> java.io.*;> class> Test {> >synchronized> void> test_function(>int> n)> >{> >// synchronized method> >for> (>int> i =>1>; i <=>3>; i++) {> >System.out.println(n + i);> >try> {> >Thread.sleep(>500>);> >}> >catch> (Exception e) {> >System.out.println(e);> >}> >}> >}> }> // Driver Class> public> class> GFG {> >// Main function> >public> static> void> main(String args[])> >{> >// only one object> >final> Test obj =>new> Test();> >Thread a =>new> Thread() {> >public> void> run() { obj.test_function(>15>); }> >};> >Thread b =>new> Thread() {> >public> void> run() { obj.test_function(>30>); }> >};> >a.start();> >b.start();> >}> }>

>

>

Ieșire

16 17 18 31 32 33>