Sincronització a Java: què, com i per què?



Aquest article sobre Sincronització a Java us ajudarà a guiar el vostre camí per aprendre sobre la sincronització de programes de diversos fils.

Els programes de diversos fils poden presentar regularment una circumstància en què són múltiples intentar arribar al mateix recurs que produeix resultats fraudulents i sorprenents. Això es pot resoldre mitjançant la sincronització a Java. Només un sol fil específic pot arribar al recurs en un propòsit determinat de temps. Aquest article us ajudarà a familiaritzar-vos amb l’estratègia de sincronització.

Discutiré els temes per aquest ordre:





Comencem!

Per què utilitzar la sincronització a Java?



Si comenceu amb almenys dos fils dins d'un programa, és possible que hi hagi una possibilitat que diversos fils intentin arribar al mateix recurs. Fins i tot pot crear un resultat inesperat a causa de problemes de simultaneïtat.

Sintaxi :

sincronitzat (objectidentifier) ​​{// Accediu a variables compartides i altres recursos compartits}

Per exemple, intenta escriure dins d'un fitxer equivalent. Això pot danyar les dades, ja que un dels fils pot anul·lar-los o quan un fil obre el fitxermateix fitxer alhora, un altre fil podria estar tancant el mateix fitxer.Cal sincronitzar l'acció de diversos fils. Això es pot implementar mitjançant un concepte anomenat M onitors .



  • Cadascun s’associa a un monitor que un fil pot bloquejar o desbloquejar.
  • Només un fil a la vegada pot contenir un pany al monitor.
  • Java el llenguatge de programació proporciona una manera molt útil de crear fils i sincronitzar la seva tasca mitjançant el fitxer Sincronitzat blocs.
  • També manté els recursos compartits dins d’aquest bloc en particular.

Els blocs sincronitzats a Java es marquen amb el fitxer Sincronitzat paraula clau. Aquest bloc de Java està sincronitzat en algun objecte.Tots els blocs que estiguin sincronitzats amb el mateix objecte només poden tenir un fil executant-los a la vegada. La resta de fils que intenten entrar al bloc sincronitzat es bloquegen fins que el fil dins del bloc sincronitzat surt del bloc.

Tipus de sincronització

Bàsicament hi ha dos tipus de sincronització disponibles. Ells són:

  1. Sincronització de processos: L'execució simultània de múltiples fils o processos per arribar a un estat tal que es comprometin amb una determinada seqüència d'accions.
  2. Sincronització de fils: En moments en què hi ha més d’un filintenta accedir a un recurs compartit, heu d'assegurar-vos que el recurs només l'utilitzarà aun temps de.

No entrem en els detalls d’aquest tipus i intentem entendre què són els bloquejos .

Panys a Java

Com he esmentat anteriorment, la sincronització es basa en una entitat interna coneguda com a pany o bé monitor . Tots els objectes tenen un pany associat. Per tant, un fil que necessiti un accés constant als camps d’un objecte ha d’adquirir el bloqueig de l’objecte abans d’accedir-hi i, a continuació, alliberar-lo quan finalitzi la feina.

Des de Java 5, el paquet java.util.concurrent.locks conté moltes implementacions de bloqueig.

Així és com sembla un pany:

bloqueig de classe pública {private boolean isLocked = fals públic sincronitzat buit bloqueig () llança InterruptedException {mentre que (isLocked) {wait ()} isLocked = true} públic sincronitzat buit desbloqueig () {isLocked = fals notificar ()}}

El mètode lock () bloqueja la instància de bloqueig de manera que tots els fils que criden a lock () queden bloquejats fins que s’executa unlock ().

com crear un conjunt

Multi-threading sense sincronització

Aquí teniu un exemple senzill que imprimeix el valor del comptador en una seqüència i cada cop que l’executem produeix un resultat diferent en funció de la disponibilitat de la CPU a un fil. Mira això!

classe 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') } } }

Els resultats del programa anterior són:

Sortida- Sincronització a Java- Edureka

Multi-threading amb sincronització

Aquest és el mateix exemple que l'anterior, però imprimeix el valor del comptador a la seqüència. Cada vegada que l’executem produeix el mateix resultat.

class Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Exception e) {System. out.println ('Thread interromput.')}}} classe Thread estén Multithread {Private Thread t private String threadName Multithread MT Thread (Nom de la cadena, Multithread mt) {threadName = name MT = mt} public void run () {synchronized ( MT) {MT.printCount ()} System.out.println ('Fil' + threadName + 'sortint.')} Public void start () {System.out.println ('Start' + threadName) if (t == null) {t = fil nou (this, threadName) t.start ()}}} public class TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = new thread ('Thread - 1 ', MT) Fil T1 = fil nou (' Fil - 2 ', MT) T.start () T1.start () // espera que acabin els fils, prova {T.join () T1.join ()} catch (Excepció e) {System.out.println ('Interromput')}}}

La sortida es mostra a continuació:

Paraula clau sincronitzada

diferència entre final i final a java

paraula clau sincronitzada marca un bloc o un mètode com a secció crítica. Una secció crítica és on només s’executa un fil a la vegada i el fil manté el bloqueig de la secció sincronitzada. Això sincronitzada la paraula clau ajuda a escriure simultània parts de qualsevol aplicació. També protegeix els recursos compartits dins del bloc.

La paraula clau sincronitzada es pot utilitzar amb:

Parlem del bloc de codi.

Paraula clau sincronitzada: un bloc de codi

Sintaxi

La sintaxi general per escriure un bloc sincronitzat és:

sincronitzat (lockObject) {// sentències sincronitzades}

Quan un fil vol executar les sentències sincronitzades dins del bloc, ha d’adquirir el bloqueig al monitor del lockObject. Només un fil pot adquirir el monitor d’un objecte de bloqueig alhora. Per tant, la resta de fils han d’esperar fins que el fil en execució actual adquireixi el bloqueig i acabi la seva execució.
D’aquesta manera, el sincronitzada La paraula clau garanteix que només un fil executarà les instruccions de bloc sincronitzades a la vegada i, per tant, impedeix que diversos fils corrompin les dades compartides presents al bloc.

Nota :

  • Si es posa un fil a dormir (utilitzant dormir () mètode) llavors no deixa anar el pany. Durant aquest temps de repòs, cap fil executarà les instruccions de bloc sincronitzades.
  • La sincronització de Java es llançarà NullPointerException si es bloqueja l'objecte utilitzat a ' sincronitzat (bloqueig) ‘És nul.

Ara, parlem del mètode.

Paraula clau sincronitzada: Un mètode

Sintaxi

La sintaxi general per escriure un mètode sincronitzat és:

mètode sincronitzat (paràmetres) {// codi sincronitzat}

Aquí lockObject és només una referència a un objecte el bloqueig del qual està associat amb el monitor que representa les sentències sincronitzades.

De manera similar al bloc sincronitzat, un fil ha d'adquirir el bloqueig de l'objecte del monitor connectat amb el mètode sincronitzat. En el cas del mètode sincronitzat, l'objecte de bloqueig és:

  • Objecte ‘.class’ - si el mètode donat és estàtic .
  • 'Aquest' objecte - si el mètode és no estàtic . 'Això' és la referència a l'objecte actual en què s'invoca el mètode sincronitzat.

La paraula clau sincronitzada Java és novetat a la natura. Significa que si un mètode sincronitzat crida a un altre mètode sincronitzat que requereix el mateix bloqueig, el fil actual que manté el bloqueig pot entrar en aquest mètode sense adquirir el bloqueig.

Passem al tema final d’aquest article i assenyalem les principals diferències entre la paraula clau sincronitzada i el bloc de sincronització.

Diferència entre la paraula clau sincronitzada i el bloc sincronitzat

  • Quan utilitzeu una paraula clau sincronitzada amb mètode , adquireix un bloqueig a l'objecte per a tot el mètode. Això significa que cap altre fil no pot utilitzar cap mètode sincronitzat fins que el fil actual que s'invoca hagi acabat l'execució.
  • Sincronitzat bloc adquireix un bloqueig de l’objecte només entre parèntesis després d’especificar la paraula clau sincronitzada. Això vol dir que cap altre fil pot adquirir un bloqueig de l’objecte ja bloquejat fins que no surti el bloc. Però altres fils podran accedir a la resta del codi que hi ha al mètode.

Això ens porta al final d’aquest article, on hem analitzat com funciona exactament la sincronització en Java. Espero que tingueu clar tot el que us ha estat compartit en aquest tutorial.

Consulteu el per Edureka, una empresa d'aprenentatge en línia de confiança amb una xarxa de més de 250.000 estudiants satisfets repartits per tot el món. Estem aquí per ajudar-vos en tots els passos del vostre viatge, per convertir-vos en una pregunta a part d’aquestes entrevistes java, oferim un pla d’estudis dissenyat per a estudiants i professionals que vulguin ser desenvolupador de Java.

Tens alguna pregunta? Esmenteu-lo a la secció de comentaris d’aquest “Sincronització a Java ' article i ens posarem en contacte amb vostè el més aviat possible.