Synkronointi Java: Mitä, miten ja miksi?



Tämä Java-synkronointia käsittelevä artikkeli auttaa sinua oppimaan oppimaan monisäikeisten ohjelmien synkronoinnista.

Monisäikeisissä ohjelmissa voi säännöllisesti esiintyä olosuhteita, joissa useita yrittää päästä samalle resurssille, joka tuottaa vilpillisiä ja hämmästyttäviä tuloksia. Tämä voidaan ratkaista käyttämällä Java-synkronointia. Vain yksi tietty ketju voi päästä resurssiin tietyllä ajankohdalla. Tämä artikkeli auttaa sinua tutustumaan synkronointistrategiaan.

Keskustelen aiheista tässä järjestyksessä:





Aloitetaan!

Miksi käyttää synkronointia Java-ohjelmassa?



Jos aloitat vähintään kahdesta säikeestä ohjelman sisällä, voi olla mahdollista, että useat ketjut yrittävät päästä samaan resurssiin. Se voi jopa luoda odottamattoman tuloksen samanaikaisuusongelmien takia.

Syntaksi :

synkronoitu (objectidentifier) ​​{// Käytä jaettuja muuttujia ja muita jaettuja resursseja}

Esimerkiksi, yritä kirjoittaa vastaavassa tiedostossa. Tämä voi vahingoittaa tietoja, koska yksi ketjuista voi ohittaa tiedot tai kun ketju avaasamaan tiedostoon samanaikaisesti, toinen ketju saattaa sulkea saman tiedoston.Useiden säikeiden toiminta on tarpeen synkronoida. Tämä voidaan toteuttaa käyttämällä nimeltään konseptia M katsojia .



  • Jokainen liittyy näyttöön, jonka lanka voi lukita tai avata.
  • Vain yksi lanka kerrallaan voi pitää lukon monitorissa.
  • Java ohjelmointikieli on erittäin kätevä tapa luoda ketjuja ja synkronoida heidän tehtävänsä Synkronoitu lohkot.
  • Se pitää myös jaetut resurssit tässä lohkossa.

Javan synkronoidut lohkot on merkitty Synkronoitu avainsana. Tämä Java-lohko on synkronoitu jossakin objektissa.Kaikilla samalla objektilla synkronoiduilla lohkoilla voi olla vain yksi lanka, joka voidaan suorittaa kerrallaan. Kaikki muut ketjut, jotka yrittävät päästä synkronoituun lohkoon, estetään, kunnes synkronoidun lohkon sisällä oleva säie poistuu lohkosta.

Synkronoinnin tyypit

Synkronointia on periaatteessa kahta tyyppiä. He ovat:

  1. Prosessin synkronointi: Useiden ketjujen tai prosessien samanaikainen suorittaminen sellaisen tilan saavuttamiseksi, että ne sitoutuvat tiettyyn toimintosarjaan.
  2. Kierteen synkronointi: Joskus useampi kuin yksi lankayrittää käyttää jaettua resurssia, sinun on varmistettava, että resurssia käyttää vain yksi ketju verkkotunnuksessaaika.

Älkäämme käsittele tämän tyyppisiä yksityiskohtia ja yritä ymmärtää, mitä lukot ovat .

Lukitsee Java

Kuten aiemmin mainitsin, synkronointi rakennetaan sisäisen entiteetin ympärille Lukko tai monitori . Jokaisella esineellä on lukko. Joten langan, joka tarvitsee jatkuvan pääsyn objektin kenttiin, on hankittava objektin lukko ennen pääsyä niihin ja vapautettava lukko, kun työ on valmis.

Java 5: stä paketti java.util.concurrent.locks sisältää monia lukitustoteutuksia.

Näin lukko näyttää:

ero jqueryn ja javascriptin välillä
julkisen luokan lukitus {private boolean isLocked = false public synchronized void lock () heittää InterruptedException {while (isLocked) {wait ()} isLocked = true} julkisen synkronoidun void lukituksen () {isLocked = väärä ilmoitus ()}}

Lock () -menetelmä lukitsee Lock-esiintymän siten, että kaikki lukitusta () kutsuvat säikeet estetään, kunnes lukitus () suoritetaan.

Monisäikeinen ilman synkronointia

Tässä on yksinkertainen esimerkki, joka tulostaa laskurin arvon peräkkäin ja joka kerta kun suoritamme sen, se tuottaa erilaisen tuloksen, joka perustuu prosessorin saatavuuteen ketjuun. Tsekkaa tämä!

luokka Monisäikeinen {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') } } }

Yllä olevan ohjelman tulokset tässä:

Lähtö- synkronointi Java- Edurekassa

Monisäikeinen synkronointi

Tämä on sama esimerkki kuin yllä, mutta se tulostaa laskurin arvon järjestyksessä. Joka kerta kun suoritamme sen, se tuottaa saman tuloksen.

class Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Poikkeus e) {System. out.println ('Kierre keskeytetty.')}}} -lanka Lanka jatkuu monisäikeinen {yksityinen ketju t yksityinen merkkijono threadName monisäikeinen MT-ketju (merkkijono, monisäikeinen mt) {threadName = nimi MT = mt} public void run () {synchronized ( MT) {MT.printCount ()} System.out.println ('Säie' + säieNimi + 'poistuu.')} Public void start () {System.out.println ('Käynnistäminen' + säiNimi) 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 ('Lanka) - 1 ', MT) Kierre T1 = uusi ketju (' Kierre - 2 ', MT) T.start () T1.start () // odota, että ketjut loppuvat, kokeile {T.join () T1.join ()} saalis (poikkeus e) {System.out.println ('Keskeytetty')}}}

Tuotos on kuvattu alla:

Synkronoitu avainsana

synkronoitu avainsana merkitsee lohkon tai menetelmän kriittiseksi osaksi. Kriittinen osa on silloin, kun vain yksi ketju suorittaa kerrallaan, ja lanka pitää lukituksen synkronoidulle osalle. Tämä synkronoitu avainsana auttaa kirjoittamisessa samanaikaisesti minkä tahansa sovelluksen osat. Se suojaa myös lohkon sisäisiä resursseja.

Synkronoitua avainsanaa voidaan käyttää seuraavien kanssa:

Keskustellaan koodilohkosta.

Synkronoitu avainsana: Koodilohko

Syntaksi

Synkronoidun lohkon kirjoittamisen yleinen syntaksi on:

synkronoitu (lockObject) {// synkronoidut lauseet}

Kun ketju haluaa suorittaa synkronoidut lauseet lohkon sisällä, sen on hankittava lukko lockObject-näytön. Vain yksi lanka voi hankkia lukitusobjektin näytön kerrallaan. Joten kaikkien muiden ketjujen on odotettava, kunnes parhaillaan suoritettava säie hankkii lukituksen, ja lopetettava sen suorittaminen.
Tällä tavalla synkronoitu avainsana takaa, että vain yksi ketju suorittaa synkronoidut lohkolauseet kerrallaan, ja estää siten useita ketjuja vioittamasta lohkon sisällä olevaa jaettua dataa.

Huomautus :

  • Jos lepotila asetetaan lepotilaan (käyttäen nukkua() menetelmä), se ei vapauta lukkoa. Tänä lepoaikana mikään säie ei suorita synkronoituja lohkolausekkeita.
  • Java-synkronointi heittää NullPointerException jos lukitusobjektia käytetään synkronoitu (lukko) ’On tyhjä.

Keskustellaan nyt menetelmästä.

Synkronoitu avainsana: Menetelmä

Syntaksi

Yleinen syntaksin kirjoittaminen a synkronoitu menetelmä On:

synkronoitu menetelmä (parametrit) {// synkronoitu koodi}

Tässä lockObject on vain viittaus objektiin, jonka lukitus liittyy monitoriin, joka edustaa synkronoituja lauseita.

Samoin kuin synkronoidussa lohkossa, langan on hankittava lukitus liitetyssä monitoriobjektissa synkronoidulla menetelmällä. Synkronoidun menetelmän tapauksessa lukitusobjekti on:

  • ”.Luokan” esine - jos annettu menetelmä on staattinen .
  • ”Tämä” esine - jos menetelmä on ei-staattinen . 'Tämä' on viittaus nykyiseen objektiin, jossa synkronoitua menetelmää käytetään.

Java-synkronoitu avainsana on uudelle tulokkaalle luonnossa. Se tarkoittaa, että jos synkronoitu menetelmä kutsuu toista synkronoitua menetelmää, joka vaatii samaa lukitusta, niin nykyinen lukkoa pitävä säie voi päästä kyseiseen menetelmään hankkimatta lukkoa.

Siirrytään eteenpäin tämän artikkelin viimeiseen aiheeseen ja tuodaan esiin suurimmat erot synkronoidun avainsanan ja synkronointilohkon välillä.

Ero synkronoidun avainsanan ja synkronoidun lohkon välillä

  • Kun käytät synkronoitua avainsanaa a: n kanssa menetelmä , se hankkii lukon objektiin koko menetelmälle. Tämä tarkoittaa, että mikään muu ketju ei voi käyttää mitään synkronoitua menetelmää, ennen kuin nykyinen haettu ketju on suoritettu loppuun.
  • Synkronoitu lohko hankkii lukituksen objektiin vain sulkeiden väliin, kun synkronoitu avainsana on määritetty. Tämä tarkoittaa, että mikään muu lanka ei voi hankkia lukitusta jo lukittuun esineeseen, ennen kuin lohko poistuu. Mutta muut säikeet pääsevät käsiksi muuhun menetelmässä olevaan koodiin.

Tämä tuo meidät tämän artikkelin loppuun, jossa olemme keskustelleet siitä, miten Java-synkronointi toimii tarkalleen. Toivottavasti olet selvillä kaikesta, mitä sinulle on jaettu tässä opetusohjelmassa.

Katso Edureka, luotettava verkko-oppimisyritys, jolla on yli 250 000 tyytyväisen oppijan verkosto, joka levisi ympäri maailmaa. Olemme täällä auttaaksemme sinua matkasi jokaisessa vaiheessa, jotta tulemme tämän java-haastattelukysymyksen lisäksi, keksimme opetussuunnitelman, joka on tarkoitettu opiskelijoille ja ammattilaisille, jotka haluavat olla Java-kehittäjiä.

Onko sinulla kysymys meille? Mainitse se tämän Java-synkronoinnin kommenttiosassa ' artikkeli ja palaamme sinuun mahdollisimman pian.