Večnitni programi lahko pogosto pridejo v situacijo, ko več niti poskuša dostopati do istih virov in na koncu povzroči napačne in nepredvidene rezultate.
Zakaj uporabljati sinhronizacijo Java?
Sinhronizacija Java se uporablja za zagotovitev, da z neko metodo sinhronizacije samo ena nit dostopa do vira v danem trenutku.
zamenjaj vse
Sinhronizirani bloki Java
Java omogoča ustvarjanje niti in sinhronizacijo njihovih nalog s pomočjo sinhroniziranih blokov.
Sinhronizirani blok v Javi je sinhroniziran na nekem objektu. Vsi sinhronizirani bloki se sinhronizirajo na istem objektu in v njih se lahko hkrati izvaja samo ena nit. Vse druge niti, ki poskušajo vstopiti v sinhronizirani blok, so blokirane, dokler nit znotraj sinhroniziranega bloka ne zapusti bloka.
Opomba: Sinhronizirani bloki v Javi so označeni s ključno besedo synchronized.
Splošna oblika sinhroniziranega bloka
// 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 }> Ta sinhronizacija je implementirana v Javi s konceptom, imenovanim monitorji ali ključavnice. Samo ena nit ima lahko v danem trenutku monitor. Ko nit pridobi ključavnico, se reče, da je vstopila v monitor. Vse druge niti, ki poskušajo vstopiti v zaklenjeni monitor, bodo začasno ustavljene, dokler prva nit ne zapusti monitorja.
Vrste sinhronizacije
V Javi sta spodaj omenjeni dve sinhronizaciji:
- Sinhronizacija procesa
- Sinhronizacija niti
1. Sinhronizacija procesov v Javi
Sinhronizacija procesov je tehnika, ki se uporablja za usklajevanje izvajanja več procesov. Zagotavlja, da so skupni viri varni in v redu.
2. Sinhronizacija niti v Javi
Sinhronizacija niti se uporablja za usklajevanje in urejanje izvajanja niti v večnitnem programu. Spodaj sta omenjeni dve vrsti sinhronizacije niti:
- Medsebojna izključitev
- Sodelovanje (komunikacija med nitmi v Javi)
Medsebojna izključitev
Mutual Exclusive pomaga preprečiti, da bi se niti med souporabo podatkov med seboj motile. Spodaj so navedene tri vrste vzajemnega izključevanja:
- Sinhronizirana metoda.
- Sinhroniziran blok.
- Statična sinhronizacija.
Primer sinhronizacije
Spodaj je izvedba sinhronizacije Java:
Java
lokalni datum java
// 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'>);> >}> >}> }> |
>
definirati računalnik
>Izhod
Sending Hi Hi Sent Sending Bye Bye Sent>
Izhod je enak vsakič, ko zaženemo program.
pogojni operator v Javi
Pojasnilo
V zgornjem primeru se odločimo za sinhronizacijo objekta Sender znotraj metode run() razreda ThreadedSend. Druga možnost je, da lahko definiramo celoten blok send() kot sinhroniziran , enak rezultat. Potem nam ni treba sinhronizirati objekta Message znotraj metode run() v razredu 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'); } }> Ni nam treba vedno sinhronizirati celotne metode. Včasih je bolje, da sinhronizira le del metode . To omogočajo sinhronizirani bloki Java znotraj metod.
// 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'); } } }> Primer sinhronizirane metode z uporabo anonimnega razreda
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();> >}> }> |
>
>
pomladne stIzhod
16 17 18 31 32 33>