logo

Synkronointi Javassa

Monisäikeiset ohjelmat voivat usein joutua tilanteeseen, jossa useat säikeet yrittävät käyttää samoja resursseja ja lopulta tuottaa virheellisiä ja odottamattomia tuloksia.

Miksi käyttää Java-synkronointia?

Java-synkronointia käytetään varmistamaan jollain synkronointimenetelmällä, että vain yksi säie voi käyttää resurssia tiettynä ajankohtana.

html-tageja

Synkronoidut Java-lohkot

Java tarjoaa tavan luoda säikeitä ja synkronoida niiden tehtävät synkronoitujen lohkojen avulla.



Synkronoitu Java-lohko synkronoidaan johonkin objektiin. Kaikki synkronoidut lohkot synkronoidaan saman objektin kanssa, ja niiden sisällä voi olla vain yksi säie kerrallaan. Kaikki muut säikeet, jotka yrittävät päästä synkronoituun lohkoon, estetään, kunnes synkronoidun lohkon sisällä oleva säie poistuu lohkosta.

Huomautus: Synkronoidut lohkot Javassa on merkitty synkronoidulla avainsanalla.

Synkronoidun lohkon yleinen muoto

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

Tämä synkronointi on toteutettu Javassa näytöt tai lukot -nimisellä konseptilla. Vain yksi säie voi omistaa näytön kerrallaan. Kun lanka lukkiutuu, sen sanotaan menneen monitoriin. Kaikki muut säikeet, jotka yrittävät päästä lukittuun näyttöön, keskeytetään, kunnes ensimmäinen säie poistuu näytöstä.

Synkronoinnin tyypit

Javassa on kaksi alla mainittua synkronointia:

  1. Prosessin synkronointi
  2. Säikeen synkronointi

1. Prosessin synkronointi Javassa

Prosessien synkronointi on tekniikka, jota käytetään useiden prosessien suorittamisen koordinoimiseen. Se varmistaa, että yhteiset resurssit ovat turvallisia ja kunnossa.

2. Säikeen synkronointi Javassa

Säikeen synkronointia käytetään säikeiden suoritusten koordinointiin ja järjestämiseen monisäikeisessä ohjelmassa. Jäljempänä mainitaan kaksi säietynkronointityyppiä:

  • Keskinäinen yksinoikeus
  • Yhteistyö (säikeiden välinen viestintä Javassa)

Keskinäinen yksinoikeus

Mutual Exclusive auttaa estämään säikeitä häiritsemästä toisiaan tietojen jakamisen aikana. Alla mainittuja keskinäisiä yksinoikeuksia on kolme:

  • Synkronoitu menetelmä.
  • Synkronoitu lohko.
  • Staattinen synkronointi.

Esimerkki synkronoinnista

Alla on Java-synkronoinnin toteutus:

Java

java luontiluettelo




vuosineljänneksen liiketoiminnassa
// 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'>);> >}> >}> }>

>

>

Lähtö

Sending Hi Hi Sent Sending Bye Bye Sent>

Tulos on sama joka kerta, kun suoritamme ohjelman.

Selitys

Yllä olevassa esimerkissä valitsemme Sender-objektin synkronoinnin ThreadedSend-luokan run()-metodin sisällä. Vaihtoehtoisesti voisimme määritellä koko send()-lohko synkronoituna , tuottaa saman tuloksen. Silloin meidän ei tarvitse synkronoida Message-objektia run()-metodin sisällä ThreadedSend-luokassa.

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

Meidän ei aina tarvitse synkronoida koko menetelmää. Joskus se on parempi synkronoida vain osa menetelmästä . Java-synkronoidut lohkot menetelmien sisällä tekevät tämän mahdolliseksi.

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

Esimerkki synkronoidusta menetelmästä anonyymin luokan avulla

Java

python on numeerinen




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

>

kipinä opetusohjelma

>

Lähtö

16 17 18 31 32 33>