Sinchronizavimas „Java“: kas, kaip ir kodėl?

Šis straipsnis apie „Java“ sinchronizavimą padės jums sužinoti, kaip sinchronizuoti daugialypes programas.

Daugialypės programos gali reguliariai susidurti su aplinkybėmis, kai kelios bandyti patekti į tą patį šaltinį, kuris sukelia apgaulingus ir stulbinančius rezultatus. Tai galima išspręsti naudojant „Java“ sinchronizavimą. Tik vienas konkretus siūlas gali patekti į išteklių tam tikru laiko tikslu. Šis straipsnis padės jums susipažinti su sinchronizavimo strategija.

Aptarsiu temas tokia tvarka:



Pradėkime!

Kodėl verta naudoti „Java“ sinchronizavimą?

Jei programoje pradedate bent nuo dviejų gijų, gali būti tikimybė, kai kelios gijos bandys patekti į tą patį šaltinį. Tai gali sukelti netikėtą rezultatą dėl lygiagretumo problemų.

Sintaksė :

sinchronizuotas (objekto identifikatorius) {// Pasiekite bendrinamus kintamuosius ir kitus bendrinamus išteklius}

Pavyzdžiui, bandyti rašyti į lygiavertį failą. Tai gali sugadinti duomenis, nes viena iš gijų gali nepaisyti duomenų arba kai gija atidarotuo pačiu metu, kita gija gali uždaryti tą patį failą.Reikia sinchronizuoti kelių gijų veiksmus. Tai galima įgyvendinti naudojant vadinamąją koncepciją M stebėtojai .

  • Kiekvienas yra susietas su monitoriumi, kurį gija gali užrakinti arba atrakinti.
  • Monitoriaus užraktą vienu metu gali laikyti tik viena gija.
  • „Java“ programavimo kalba yra labai patogus būdas sukurti gijas ir sinchronizuoti jų užduotis naudojant Sinchronizuotas blokai.
  • Taip pat bendrus išteklius saugo šis blokas.

Sinchronizuoti „Java“ blokai pažymėti Sinchronizuotas raktinis žodis. Šis „Java“ blokas yra sinchronizuojamas kokiame nors objekte.Visuose blokuose, kurie sinchronizuojami tame pačiame objekte, vienu metu gali būti tik viena gija. Visos kitos gijos, bandančios patekti į sinchronizuotą bloką, yra užblokuotos, kol gija sinchronizuoto bloko viduje išeina iš bloko.

Sinchronizavimo tipai

Iš esmės yra dviejų tipų sinchronizavimas. Jie yra:

  1. Proceso sinchronizavimas: Vienu metu atliekami keli gijos ar procesai, kad būtų pasiekta tokia būsena, kad jie įsipareigotų atlikti tam tikrą veiksmų seką.
  2. Gijų sinchronizavimas: Kartais, kai daugiau nei viena gijabando pasiekti bendrą išteklių, turite įsitikinti, kad išteklius naudos tik viena gija, esantilaikas.

Nesigilinkime į šių tipų detales ir bandykime suprasti, kas yra spynos .

Spynos „Java“

Kaip jau minėjau anksčiau, sinchronizavimas yra pagrįstas vidiniu subjektu, vadinamu užraktas arba monitorius . Kiekvienas objektas turi užraktą, susietą su juo. Taigi gija, kuriai reikalinga nuosekli prieiga prie objekto laukų, prieš prieidama prie jų, turi įsigyti objekto užraktą, o tada, kai darbas bus atliktas, atleiskite spyną.

Iš „Java 5“ pakete java.util.concurrent.locks yra daugybė užrakto įgyvendinimų.

Taip atrodo spyna:

viešosios klasės užraktas {private boolean isLocked = false public synchronized void lock () throws InterruptedException {while (isLocked) {wait ()} isLocked = true} public synchronized void unlock () {isLocked = false pranešimas ()}}

Užrakto () metodas užrakina užrakto egzempliorių, kad visi pokalbiai, skambinantys užraktu (), būtų užblokuoti, kol bus įvykdytas atrakinimas ().

Keli siūlai be sinchronizavimo

Čia yra paprastas pavyzdys, kuris atspausdina skaitiklio vertę iš eilės ir kiekvieną kartą ją paleidus, gaunamas vis kitas rezultatas, atsižvelgiant į procesoriaus prieinamumą gijai. Pažiūrėk!

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

Pirmiau nurodytų programos rezultatų:

java kaip naudotis tostring

Išvestis - sinchronizavimas „Java“ - „Edureka“

Daugialypis sriegimas su sinchronizavimu

Tai yra tas pats pavyzdys, kaip ir aukščiau, bet jis atspausdina skaitiklio vertę seka. Kiekvieną kartą, kai jį paleidžiame, gaunamas tas pats rezultatas.

class Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (e išimtis) {System. out.println ('Gija nutraukta.')}}} klasė Gija pratęsia daugiasluoksnę {privačią giją t privačią eilutės giją „Pavadinimas“ daugiagiją MT sriegį (eilutės pavadinimas, daugiasluoksnis siūlas mt) {gijos_vardas = vardas MT = mt} viešas negaliojantis (({ MT) {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) Sriegis T1 = nauja gija (' Sriegis - 2 ', MT) T.start () T1.start () // palaukite, kol gijos baigsis, pabandykite {T.join () T1.join ()} sugavimas (e išimtis) {System.out.println ('Interrupted')}}}

Rezultatas pavaizduotas žemiau:

Sinchronizuotas raktinis žodis

sinchronizuotas raktinis žodis pažymi bloką ar metodą kritine dalimi. Kritinė sekcija yra ta, kai vienu metu vykdoma tik viena gija, o gija laiko sinchronizuoto skyriaus užraktą. Tai sinchronizuotas raktinis žodis padeda rašyti kartu bet kurios programos dalys. Tai taip pat apsaugo bendrus išteklius bloke.

Sinchronizuotą raktinį žodį galima naudoti su:

Aptarkime kodo bloką.

Sinchronizuotas raktinis žodis: kodo blokas

Sintaksė

Bendra sinchronizuoto bloko rašymo sintaksė yra:

sinchronizuoti (lockObject) {// sinchronizuoti sakiniai}

Kai gija nori įvykdyti sinchronizuotus sakinius bloko viduje, ji turi įsigyti „lockObject“ monitoriaus užraktą. Užrakto objekto monitorių vienu metu gali įsigyti tik viena gija. Taigi visos kitos gijos turi palaukti, kol šiuo metu vykdomas siūlas įgis užraktą, ir užbaigti jo vykdymą.
Tokiu būdu sinchronizuotas raktinis žodis garantuoja, kad sinchronizuotus blokinius sakinius vienu metu vykdys tik viena gija, ir taip užkirs kelią kelioms gijoms sugadinti bendrus duomenis, esančius bloko viduje.

Pastaba :

  • Jei miegas užmigdomas siūlu (naudojant miegas () metodas), tada ji neatleidžia spynos. Per šį miego laiką nė viena gija nevykdys sinchronizuotų blokų sakinių.
  • „Java“ sinchronizavimas išmes „NullPointerException“ jei užrakto objektas naudojamas sinchronizuotas (užraktas) ‘Yra niekinis.

Dabar aptarkime metodą.

Sinchronizuotas raktinis žodis: Metodas

Sintaksė

Bendra sintaksė rašant a sinchronizuotas metodas yra:

sinchronizuotas metodas (parametrai) {// sinchronizuotas kodas}

Čia lockObject yra tik nuoroda į objektą, kurio užraktas susietas su monitoriumi, kuris rodo sinchronizuotus sakinius.

Panašiai kaip sinchronizuotame bloke, gija sinchronizuotu būdu turi įsigyti prijungto monitoriaus objekto užraktą. Sinchronizuoto metodo atveju užrakto objektas yra:

  • Objektas. .Klasė - jei nurodytas metodas yra statinis .
  • „Šis“ objektas - jei metodas yra nestatiškas . „Tai“ yra nuoroda į esamą objektą, kuriame naudojamas sinchronizuotas metodas.

Sinchronizuotas „Java“ raktinis žodis yra pakartotinis dalyvis gamtoje. Tai reiškia, kad jei sinchronizuotas metodas reikalauja kito sinchronizuoto metodo, kuriam reikalingas tas pats užraktas, tada užraktą laikantis dabartinis siūlas gali įeiti į tą metodą neįgydamas užrakto.

Pereikime prie paskutinės šio straipsnio temos ir atkreipkime dėmesį į pagrindinius skirtumus tarp sinchronizuoto raktinio žodžio ir sinchronizavimo bloko.

Skirtumas tarp sinchronizuoto raktinio žodžio ir sinchronizuoto bloko

  • Kai naudojate sinchronizuotą raktinį žodį su a metodas , jis įgyja objekto užraktą visam metodui. Tai reiškia, kad jokia kita gija negali naudoti jokio sinchronizuoto metodo, kol dabartinė siūloma gija nebus baigta vykdyti.
  • Sinchronizuotas blokuoti objekto užraktą įgyja tik tarp skliaustų, nurodžius sinchronizuotą raktinį žodį. Tai reiškia, kad jokia kita gija negali įsigyti jau užrakinto objekto užrakto, kol blokas neišeis. Tačiau kitos gijos galės pasiekti likusį kodą, kuris yra metode.

Taip pateksime į šio straipsnio pabaigą, kur aptarsime, kaip tiksliai veikia „Java“ sinchronizavimas. Tikiuosi, kad jums aišku viskas, kas su jumis buvo pasidalinta šioje pamokoje.

Patikrinkite sukūrė „Edureka“ - patikima internetinė mokymosi įmonė, turinti daugiau nei 250 000 patenkintų besimokančiųjų tinklą. Mes esame čia, kad padėtume jums kiekviename jūsų kelionės žingsnyje, kad taptume be šių „Java“ interviu klausimų, mes parengėme programą, skirtą studentams ir specialistams, norintiems būti „Java“ kūrėjais.

Turite mums klausimą? Prašau paminėti tai komentarų skyriuje „Sinchronizavimas„ Java “ ' straipsnį ir mes kuo greičiau susisieksime su jumis.