logo

Sinchronizavimas Java

Kelių gijų programos dažnai gali patekti į situaciją, kai kelios gijos bando pasiekti tuos pačius išteklius ir galiausiai duoda klaidingų ir nenumatytų rezultatų.

Kodėl naudoti Java sinchronizavimą?

„Java“ sinchronizavimas naudojamas tam tikru sinchronizavimo metodu užtikrinti, kad tik viena gija gali pasiekti išteklius tam tikru momentu.

kandidato raktas

Java sinchronizuoti blokai

„Java“ suteikia galimybę sukurti gijas ir sinchronizuoti jų užduotis naudojant sinchronizuotus blokus.



Sinchronizuotas „Java“ blokas yra sinchronizuojamas su kai kuriais objektais. Visi sinchronizuoti blokai sinchronizuojami tame pačiame objekte ir vienu metu juose gali būti vykdoma tik viena gija. Visos kitos gijos, bandančios patekti į sinchronizuotą bloką, yra blokuojamos tol, kol sinchronizuotame bloke esanti gija išeina iš bloko.

Pastaba: Sinchronizuoti blokai Java yra pažymėti sinchronizuotu raktiniu žodžiu.

Bendroji sinchronizuoto bloko forma

// 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 }>

Šis sinchronizavimas įdiegtas „Java“ naudojant koncepciją, vadinamą monitoriais arba užraktais. Vienu metu monitorių gali turėti tik viena gija. Kai siūlas įgauna užraktą, sakoma, kad jis pateko į monitorių. Visos kitos gijos, bandančios patekti į užrakintą monitorių, bus sustabdytos, kol pirmoji gija išeis iš monitoriaus.

Sinchronizacijos tipai

Toliau paminėti du „Java“ sinchronizavimai:

  1. Proceso sinchronizavimas
  2. Gijos sinchronizavimas

1. Procesų sinchronizavimas Java

Procesų sinchronizavimas yra metodas, naudojamas kelių procesų vykdymui koordinuoti. Tai užtikrina, kad bendrinami ištekliai būtų saugūs ir tvarkingi.

2. Siūlų sinchronizavimas Java

Gijų sinchronizavimas naudojamas gijų vykdymui koordinuoti ir tvarkyti kelių gijų programoje. Toliau paminėti du gijų sinchronizavimo tipai:

  • Abipusis išskirtinis
  • Bendradarbiavimas (tarp gijų komunikacija Java)

Abipusis išskirtinis

„Mutual Exclusive“ padeda apsaugoti, kad gijos netrukdytų viena kitai dalijantis duomenimis. Toliau paminėti trys savitarpio išimties tipai:

  • Sinchronizuotas metodas.
  • Sinchronizuotas blokas.
  • Statinė sinchronizacija.

Sinchronizavimo pavyzdys

Žemiau pateikiamas „Java“ sinchronizavimo diegimas:

Java

kiek miestų Jungtinėse Amerikos Valstijose




// 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'>);> >}> >}> }>

metus į ketvirčius
>

>

Išvestis

Sending Hi Hi Sent Sending Bye Bye Sent>

Išvestis yra tokia pati kiekvieną kartą, kai vykdome programą.

Paaiškinimas

Aukščiau pateiktame pavyzdyje pasirenkame sinchronizuoti siuntėjo objektą ThreadedSend klasės metodo run() viduje. Arba galime apibrėžti visas send() blokas kaip sinchronizuotas , duodantis tą patį rezultatą. Tada mes neturime sinchronizuoti pranešimo objekto run() metodo viduje ThreadedSend klasėje.

// 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'); } }>

Ne visada turime sinchronizuoti visą metodą. Kartais pageidautina sinchronizuoti tik dalį metodo . „Java“ sinchronizuoti blokai metoduose leidžia tai padaryti.

// 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'); } } }>

Sinchronizuoto metodo pavyzdys naudojant anoniminę klasę

Java


Python programa dvejetainei paieškai



// 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();> >}> }>

>

np.log
>

Išvestis

16 17 18 31 32 33>