Daudzpavedienu programmas bieži var nonākt situācijā, kad vairāki pavedieni mēģina piekļūt vieniem un tiem pašiem resursiem un visbeidzot rada kļūdainus un neparedzētus rezultātus.
Kāpēc izmantot Java sinhronizāciju?
Java sinhronizācija tiek izmantota, lai ar kādu sinhronizācijas metodi nodrošinātu, ka resursam noteiktā brīdī var piekļūt tikai viens pavediens.
dfs vs bfs
Java sinhronizētie bloki
Java nodrošina veidu, kā izveidot pavedienus un sinhronizēt to uzdevumus, izmantojot sinhronizētus blokus.
Sinhronizēts Java bloks ir sinhronizēts ar kādu objektu. Visi sinhronizētie bloki tiek sinhronizēti vienā objektā, un tajos vienlaikus var tikt izpildīts tikai viens pavediens. Visi pārējie pavedieni, kas mēģina iekļūt sinhronizētajā blokā, tiek bloķēti, līdz pavediens sinhronizētajā blokā iziet no bloka.
Piezīme: Sinhronizētie bloki Java ir atzīmēti ar sinhronizēto atslēgvārdu.
Sinhronizētā bloka vispārējā 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 }> Šī sinhronizācija ir ieviesta Java ar jēdzienu, ko sauc par monitoriem vai slēdzenēm. Monitors noteiktā laikā var piederēt tikai vienam pavedienam. Kad pavediens iegūst bloķēšanu, tiek teikts, ka tas ir iekļuvis monitorā. Visi pārējie pavedieni, kas mēģina iekļūt bloķētajā monitorā, tiks apturēti, līdz pirmais pavediens iziet no monitora.
Sinhronizācijas veidi
Tālāk ir minētas divas Java sinhronizācijas:
- Procesu sinhronizācija
- Pavedienu sinhronizācija
1. Procesu sinhronizācija Java
Procesu sinhronizācija ir paņēmiens, ko izmanto, lai koordinētu vairāku procesu izpildi. Tas nodrošina, ka koplietotie resursi ir droši un kārtībā.
2. pavedienu sinhronizācija Java
Pavedienu sinhronizācija tiek izmantota, lai koordinētu un sakārtotu pavedienu izpildi daudzpavedienu programmā. Tālāk ir minēti divi pavedienu sinhronizācijas veidi:
- Savstarpēja ekskluzīva
- Sadarbība (starppavedienu komunikācija Java valodā)
Savstarpēja ekskluzīva
Mutual Exclusive palīdz neļaut pavedieniem traucēt viens otram datu koplietošanas laikā. Tālāk ir minēti trīs savstarpējās ekskluzīvas veidi:
- Sinhronizētā metode.
- Sinhronizēts bloks.
- Statiskā sinhronizācija.
Sinhronizācijas piemērs
Tālāk ir norādīta Java sinhronizācijas ieviešana:
Java
parseint java
atšķirība starp vakariņām un vakariņām
// 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'>);> >}> >}> }> |
>
>Izvade
Sending Hi Hi Sent Sending Bye Bye Sent>
Izvade ir vienāda katru reizi, kad mēs palaižam programmu.
Paskaidrojums
Iepriekš minētajā piemērā mēs izvēlamies sinhronizēt objektu Sender ThreadedSend klases metodes run() ietvaros. Alternatīvi mēs varētu definēt viss send() bloks kā sinhronizēts , radot tādu pašu rezultātu. Tad mums nav jāsinhronizē ziņojuma objekts palaišanas () metodes ietvaros ThreadedSend klasē.
// 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'); } }> Mums ne vienmēr ir jāsinhronizē visa metode. Dažreiz tas ir vēlams sinhronizēt tikai daļu no metodes . Java sinhronizētie bloki metožu ietvaros padara to iespējamu.
// 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'); } } }> Sinhronizētās metodes piemērs, izmantojot anonīmu klasi
Java
kā lasīt csv failu 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();> >}> }> |
>
poga centrā CSS
>Izvade
16 17 18 31 32 33>