Sinhronizācija Java valodā: kas, kā un kāpēc?



Šis raksts par Java sinhronizāciju palīdzēs jums uzzināt, kā sinhronizēt vairāku pavedienu programmas.

Programmas, kurās ir vairākas pavedieni, var regulāri nākt klajā ar apstākli, ka vairākas mēģinājums nokļūt pie tā paša resursa, kas rada krāpnieciskus un pārsteidzošus rezultātus. To var atrisināt, izmantojot Java sinhronizāciju. Tikai viens konkrēts pavediens var piekļūt resursam noteiktā laika posmā. Šis raksts palīdzēs jums iepazīties ar sinhronizācijas stratēģiju.

Es apspriedīšu tēmas šādā secībā:





Sāksim!

Kāpēc Java lietot sinhronizāciju?



kā mainīt skaitli

Ja sākat ar vismaz diviem pavedieniem programmas iekšienē, var būt iespēja, kad vairāki pavedieni mēģina nokļūt vienā un tajā pašā resursā. Tas var pat radīt negaidītu iznākumu, jo rodas vienlaikus problēmas.

Sintakse :

sinhronizēts (objectidentifier) ​​{// Piekļuve kopīgotajiem mainīgajiem un citiem koplietotajiem resursiem}

Piemēram, mēģināt rakstīt līdzvērtīgā failā. Tas var sabojāt datus, jo viens no pavedieniem var ignorēt datus vai kad pavediens atvertajā pašā laikā, iespējams, ka cits pavediens aizver to pašu failu.Ir nepieciešams sinhronizēt vairāku pavedienu darbību. To var īstenot, izmantojot koncepciju, ko sauc M skatītāji .



  • Katrs ir saistīts ar monitoru, kuru pavediens var bloķēt vai atbloķēt.
  • Tikai viens pavediens vienlaikus var turēt bloķētāju monitorā.
  • Java programmēšanas valoda nodrošina ļoti ērtu veidu, kā izveidot pavedienus un sinhronizēt viņu uzdevumu, izmantojot Sinhronizēts bloki.
  • Tas arī saglabā kopīgos resursus šajā konkrētajā blokā.

Sinhronizētie bloki Java ir atzīmēti ar Sinhronizēts atslēgvārds. Šis Java bloks ir sinhronizēts ar kādu objektu.Visiem blokiem, kas tiek sinhronizēti vienā objektā, vienlaikus var būt tikai viens pavediens. Visi pārējie pavedieni, kas mēģina iekļūt sinhronizētajā blokā, tiek bloķēti, līdz pavediens sinhronizētā bloka iekšpusē iziet no bloka.

Sinhronizācijas veidi

Būtībā ir pieejami divi sinhronizācijas veidi. Viņi ir:

  1. Procesa sinhronizācija: Vienlaicīga vairāku pavedienu vai procesu izpilde, lai sasniegtu stāvokli, kurā tie apņemas veikt noteiktu darbību secību.
  2. Vītnes sinhronizācija: Reizēm, kad vairāk nekā viens pavediensmēģina piekļūt koplietotam resursam, jums jānodrošina, lai resurss domēnā izmantotu tikai vienu pavedienulaiks.

Neiedziļināsimies šo veidu detaļās un nemēģināsim saprast, kas ir slēdzenes .

Slēdzenes Java

Kā jau minēju iepriekš, sinhronizācija tiek veidota ap iekšēju entītiju, kas pazīstama kā slēdzene vai monitors . Katram objektam ir saistīta slēdzene. Tātad pavedienam, kam nepieciešama pastāvīga piekļuve objekta laukiem, pirms piekļuves tiem jāiegūst objekta slēdzene un pēc tam, kad darbs ir pabeigts, tā jāatlaiž.

No Java 5 pakotne java.util.concurrent.locks satur daudzas bloķēšanas ieviešanas iespējas.

Šādi izskatās slēdzene:

publiskās klases bloķēšana {private boolean isLocked = false public synchronized void lock () thrugs InterruptedException {while (isLocked) {wait ()} isLocked = true} publiskā sinhronizētā void atbloķēšana () {isLocked = false paziņot ()}}

Bloķēšanas () metode bloķē bloķēšanas instanci, lai visi pavedieni, kas izsauc bloķēšanu (), tiktu bloķēti, līdz tiek izpildīts atbloķēšana ().

Vairākas vītnes bez sinhronizācijas

Šeit ir vienkāršs piemērs, kas izdrukā skaitītāja vērtību secībā, un katru reizi, kad mēs to palaižam, tas rada atšķirīgu rezultātu, pamatojoties uz CPU pieejamību pavedienam. Pārbaudiet to!

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

Iepriekš minētie programmas rezultāti:

Izeja- Sinhronizācija Java- Edureka

Vairākas vītnes ar sinhronizāciju

Šis ir tas pats piemērs kā iepriekš, bet tas izdrukā skaitītāja vērtību secībā. Katru reizi, kad mēs to palaižam, tas dod tādu pašu rezultātu.

klase Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (izņēmums e) {System. out.println ('Vītne pārtraukta.')}}} klase Vītne pagarina daudzsavienojumu {private Thread t private String threadName Multithread MT Thread (String name, Multithread mt) {threadName = name MT = mt} public void run () {synchronized ( 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) Vītne T1 = jauna tēma (' Vītne - 2 ', MT) T.start () T1.start () // gaidiet, kamēr pavedieni beigsies, mēģiniet {T.join () T1.join ()} catch (izņēmums e) {System.out.println ('Interrupted')}}}

Rezultāts ir attēlots zemāk:

Sinhronizēts atslēgvārds

__init __ (pats)

sinhronizēts atslēgvārds atzīmē bloku vai metodi par kritisku sadaļu. Kritiskā sadaļa ir tā, ka vienlaikus tiek izpildīts tikai viens pavediens, un pavediens satur sinhronizētās sadaļas slēdzeni. Šis sinhronizēts atslēgvārds palīdz rakstīt vienlaikus jebkura lietojuma daļas. Tas arī aizsargā koplietotos resursus blokā.

Sinhronizēto atslēgvārdu var izmantot ar:

Apspriedīsim kodu bloku.

Sinhronizēts atslēgvārds: koda bloks

Sintakse

Sinhronizēta bloka rakstīšanas sintakse ir šāda:

sinhronizēti (lockObject) {// sinhronizēti paziņojumi}

Ja pavediens vēlas izpildīt sinhronizētos paziņojumus bloka iekšienē, tam jāiegūst bloķēšana uz lockObject monitora. Bloķēšanas objekta monitoru vienlaikus var iegūt tikai viens pavediens. Tātad visiem pārējiem pavedieniem ir jāgaida, līdz pašlaik izpildošais pavediens iegūst slēdzeni, un jāpabeidz tā izpilde.
Tādā veidā sinhronizēts atslēgvārds garantē, ka sinhronizētos bloku paziņojumus vienlaikus izpildīs tikai viens pavediens, un tādējādi neļauj vairākiem pavedieniem sabojāt koplietojamos datus, kas atrodas blokā.

Piezīme :

  • Ja miegā tiek likts pavediens (izmantojot Gulēt() metodi), tad tas neatbrīvo slēdzeni. Šajā miega laikā neviens pavediens neizpildīs sinhronizētos bloku paziņojumus.
  • Java sinhronizācija iemetīs NullPointerException ja bloķēšanas objektu izmanto sinhronizēts (bloķēt) ‘Ir nulle.

Tagad apspriedīsim metodi.

Sinhronizēts atslēgvārds: Metode

Sintakse

Vispārējā sintakse rakstīšanai a sinhronizēta metode ir:

sinhronizētā metode (parametri) {// sinhronizētais kods}

Šeit lockObject ir tikai atsauce uz objektu, kura bloķēšana ir saistīta ar monitoru, kas attēlo sinhronizētos paziņojumus.

Līdzīgi kā sinhronizētajā blokā, pavedienam ar sinhronizēto metodi ir jāiegūst bloķēšana pievienotajā monitora objektā. Sinhronizētas metodes gadījumā bloķēšanas objekts ir:

  • ‘.Class’ objekts - ja dotā metode ir statisks .
  • ‘Šis’ objekts - ja metode ir nav statisks . ‘Šī’ ir atsauce uz pašreizējo objektu, kurā tiek izmantota sinhronizētā metode.

Java sinhronizētais atslēgvārds ir atkārtots dalībnieks dabā. Tas nozīmē, ka, ja sinhronizēta metode izsauc citu sinhronizētu metodi, kurai nepieciešama tā pati bloķēšana, tad pašreizējā vītne, kas tur slēdzeni, var ievadīt šo metodi, neiegūstot slēdzeni.

Pārejam uz šī raksta pēdējo tēmu un norādīsim uz galvenajām atšķirībām starp sinhronizēto atslēgvārdu un sinhronizācijas bloku.

hash karte vs hash tabula

Starpība starp sinhronizēto atslēgvārdu un sinhronizēto bloku

  • Ja izmantojat sinhronizētu atslēgvārdu ar a metodi , tas iegūst objekta bloķēšanu visai metodei. Tas nozīmē, ka neviens cits pavediens nevar izmantot nevienu sinhronizētu metodi, kamēr pašreizējais izsauktais pavediens nav pabeidzis izpildi.
  • Sinhronizēts bloķēt objekta bloķēšanu iegūst tikai starp iekavām pēc sinhronizētā atslēgvārda norādīšanas. Tas nozīmē, ka neviens cits pavediens nevar iegūt bloķēšanu jau bloķētajam objektam, līdz bloks iziet. Bet citi pavedieni varēs piekļūt pārējam kodam, kas atrodas metodē.

Tādējādi mēs nonākam līdz šī raksta beigām, kur mēs esam apsprieduši, kā tieši darbojas Java sinhronizācija. Ceru, ka jums ir skaidrs viss, kas ar jums ir kopīgots šajā apmācībā.

Pārbaudiet Autors: Edureka, uzticams tiešsaistes mācību uzņēmums ar vairāk nekā 250 000 apmierinātu izglītojamo tīklu visā pasaulē. Mēs esam šeit, lai palīdzētu jums katrā solī jūsu ceļojumā, lai kļūtu par papildus šiem Java intervijas jautājumiem, mēs piedāvājam mācību programmu, kas paredzēta studentiem un profesionāļiem, kuri vēlas būt Java izstrādātāji.

Vai mums ir jautājums? Lūdzu, pieminējiet to šīs sadaļas komentāru sadaļā “Sinhronizācija Java ' rakstu, un mēs pēc iespējas ātrāk sazināsimies ar jums.