Programiranje

Kako Java navidezni stroj izvaja sinhronizacijo niti

Vsi programi Java so zbrani v datoteke razredov, ki vsebujejo bajtode, strojni jezik navideznega stroja Java. V tem članku je opisano, kako sinhronizacijo niti upravlja navidezni stroj Java, vključno z ustreznimi bajtkodami. (1.750 besed)

Ta mesec je Pod pokrovom obravnava sinhronizacijo niti v jeziku Java in navideznem stroju Java (JVM). Ta članek je zadnji v dolgi seriji člankov z bajtkodami, ki sem jih začel lansko poletje. Opisuje edini dve opodi, ki sta neposredno povezani s sinhronizacijo niti, opodi, ki se uporabljata za vstop in izhod iz monitorjev.

Niti in skupni podatki

Ena od prednosti programskega jezika Java je podpora za večnitnost na jezikovni ravni. Večina te podpore se osredotoča na usklajevanje dostopa do podatkov, ki jih delijo več niti.

JVM organizira podatke o delujoči aplikaciji Java v več izvajalnih podatkovnih področij: enega ali več skladov Java, kopico in področje metode. Za ozadje teh spominskih področij glejte prvo Pod pokrovom članek: "Vitki, pomeni navidezni stroj."

Znotraj navideznega stroja Java je vsaki niti dodeljen znak Sklop Java, ki vsebuje podatke, do katerih ne more dostopati nobena druga nit, vključno z lokalnimi spremenljivkami, parametri in vrnjenimi vrednostmi vsake metode, ki jo je nit priklicala. Podatki na kupu so omejeni na primitivne vrste in sklicevanja na objekte. V JVM ni mogoče postaviti slike dejanskega predmeta na sklad. Vsi predmeti se nahajajo na kupu.

Obstaja samo ena kup znotraj JVM in vse niti si ga delijo. Kup vsebuje samo predmete. Na kup ni mogoče postaviti osamljenega primitivnega tipa ali reference predmeta - te stvari morajo biti del predmeta. Polja se nahajajo na kopici, vključno z nizi primitivnih vrst, toda v Javi so polja tudi predmeti.

Poleg sklada Java in kupa se lahko v JVM nahajajo tudi drugi podatki o kraju območje metode, ki vsebuje vse spremenljivke razreda (ali statične), ki jih uporablja program. Območje metode je podobno kot sklad, saj vsebuje samo primitivne tipe in reference na objekt. Za razliko od sklada pa spremenljivke razreda v območju metode delijo vse niti.

Zaklepanje predmetov in razredov

Kot je opisano zgoraj, dve pomnilniški področji v navideznem računalniku Java vsebujeta podatke v skupni rabi vseh niti. To so:

  • Kup, ki vsebuje vse predmete
  • Območje metode, ki vsebuje vse spremenljivke razreda

Če mora več niti hkrati uporabljati iste predmete ali spremenljivke razreda, je treba njihov dostop do podatkov pravilno upravljati. V nasprotnem primeru se bo program nepredvidljivo obnašal.

Za uskladitev skupnega dostopa do podatkov med več nitmi Java navidezni stroj poveže a zaklepanje z vsakim predmetom in razredom. Ključavnica je kot privilegij, ki ga lahko hkrati ima samo ena nit. Če hoče nit zakleniti določen predmet ali razred, vpraša JVM. V nekem trenutku, ko nit prosi JVM za zaklepanje - morda zelo kmalu, morda kasneje, morda nikoli - JVM da ključavnico niti. Ko nit ne potrebuje več ključavnice, jo vrne v JVM. Če je druga nit zahtevala isto ključavnico, JVM posreduje ključavnico tej niti.

Ključavnice razreda se dejansko izvajajo kot objektne ključavnice. Ko JVM naloži datoteko razreda, ustvari primerek razreda java.lang.Class. Ko zaklenete predavanje, dejansko zaklenete predavanje Razred predmet.

Niti ni treba pridobiti ključavnice za dostop do spremenljivk primerka ali razreda. Če nit pridobi ključavnico, pa nobena druga nit ne more dostopati do zaklenjenih podatkov, dokler jih nit, ki je lastnica ključavnice, ne sprosti.

Monitorji

JVM uporablja ključavnice v povezavi z monitorji. Monitor je v bistvu varuh, saj bdi nad zaporedjem kode in poskrbi, da samo ena nit hkrati izvaja kodo.

Vsak monitor je povezan s sklicem na objekt. Ko nit prispe na prvo navodilo v bloku kode, ki je pod budnim očesom monitorja, mora nit pridobiti ključavnico na referenčnem predmetu. Nit ne sme izvajati kode, dokler ne dobi ključavnice. Ko dobi ključavnico, nit vstopi v blok zaščitene kode.

Ko nit zapusti blok, ne glede na to, kako zapusti blok, sprosti ključavnico povezanega predmeta.

Več ključavnic

Ena nit lahko večkrat zaklene isti predmet. Za vsak predmet JVM vzdržuje število, kolikokrat je bil objekt zaklenjen. Odklenjeni predmet ima število nič. Ko nit prvič zaklene ključavnico, se število poveča na eno. Vsakič, ko nit pridobi zaklepanje istega predmeta, se število poveča. Vsakič, ko nit sprosti ključavnico, se število zmanjša. Ko štetje doseže nič, se ključavnica sprosti in da na voljo drugim niti.

Sinhronizirani bloki

V terminologiji jezika Java se imenuje koordinacija več niti, ki morajo dostopati do skupnih podatkov sinhronizacijo. Jezik ponuja dva vgrajena načina za sinhronizacijo dostopa do podatkov: s sinhroniziranimi stavki ali sinhroniziranimi metodami.

Sinhronizirani stavki

Če želite ustvariti sinhroniziran stavek, uporabite sinhronizirano ključna beseda z izrazom, ki ovrednoti sklic na objekt, kot v obratni vrstni red() spodnja metoda:

razred KitchenSync {private int [] intArray = new int [10]; void reverseOrder () {sinhronizirano (to) {int halfWay = intArray.length / 2; for (int i = 0; i <halfWay; ++ i) {int upperIndex = intArray.length - 1 - i; int save = intArray [upperIndex]; intArray [upperIndex] = intArray [i]; intArray [i] = shrani; }}}}

V zgornjem primeru se stavki, ki jih vsebuje sinhronizirani blok, ne bodo izvajali, dokler se ne zaklene trenutni objekt (to). Če namesto a to reference, izraz je dal sklic na drug objekt, ključavnica, povezana s tem predmetom, bo pridobljena, preden se nit nadaljuje.

Dve opcode, monitorenter in monitorexit, se uporabljajo za sinhronizacijske bloke znotraj metod, kot je prikazano v spodnji tabeli.

Tabela 1. Monitorji

OpcodeOperand (i)Opis
monitorenternobenegapop objectref, pridobite ključavnico, povezano z objectref
monitorexitnobenegapop objectref, sprostite ključavnico, povezano z objectref

Kdaj monitorenter naleti navidezni stroj Java, pridobi ključavnico za objekt, na katerega je predmet stavek objectref. Če je nit že lastnica ključavnice za ta predmet, se število poveča. Vsakič monitorexit se izvede za nit na predmetu, število se zmanjša. Ko število doseže nič, se monitor sprosti.

Oglejte si zaporedje bajt kod, ki ga generira obratni vrstni red() metoda KitchenSync razred.

Upoštevajte, da klavzula catch zagotavlja, da se zaklenjeni predmet odklene, tudi če iz sinhroniziranega bloka vržemo izjemo. Ne glede na to, kako izstopi iz sinhroniziranega bloka, se zaklepanje predmeta, pridobljeno ob vstopu niti v blok, zagotovo sprosti.

Sinhronizirane metode

Če želite sinhronizirati celotno metodo, samo vključite sinhronizirano ključna beseda kot eden od kvalifikatorjev metode, kot v:

razred HeatSync {private int [] intArray = new int [10]; sinhronizirana void reverseOrder () {int halfWay = intArray.length / 2; for (int i = 0; i <halfWay; ++ i) {int upperIndex = intArray.length - 1 - i; int save = intArray [upperIndex]; intArray [upperIndex] = intArray [i]; intArray [i] = shrani; }}}

JVM za priklic ali vrnitev sinhroniziranih metod ne uporablja posebnih kod op. Ko JVM razreši simbolni sklic na metodo, določi, ali je metoda sinhronizirana. Če je, JVM pred zagonom metode zaklene ključavnico. Za metodo primerka JVM pridobi ključavnico, povezano z objektom, na katerem se metoda prikliče. Za metodo razreda pridobi ključavnico, povezano z razredom, ki mu metoda pripada. Ko se sinhronizirana metoda zaključi, ne glede na to, ali se dokonča z vrnitvijo ali z vrnitvijo izjeme, se ključavnica sprosti.

Prihaja naslednji mesec

Zdaj, ko sem prešel celoten niz navodil bajt-kode, bom razširil obseg tega stolpca tako, da bo vključeval različne vidike ali aplikacije Java tehnologije, ne le navideznega stroja Java. Naslednji mesec začnem večdelno serijo, ki vsebuje poglobljen pregled Javinega varnostnega modela.

Bill Venners že 12 let profesionalno piše programsko opremo. S sedežem v Silicijevi dolini ponuja svetovanje in izobraževanje o programski opremi pod imenom Artima Software Company. Z leti je razvil programsko opremo za potrošniško elektroniko, izobraževanje, polprevodniške in življenjske zavarovalne panoge. Programiral je v številnih jezikih na številnih platformah: montažni jezik na različnih mikroprocesorjih, C na Unixu, C ++ na Windows, Java na spletu. Je avtor knjige Inside the Java Virtual Machine, ki jo je izdala McGraw-Hill.

Preberite več o tej temi

  • Knjiga Specifikacija Java navideznega stroja (//www.aw.com/cp/lindholm-yellin.html), Tim Lindholm in Frank Yellin (ISBN 0-201-63452-X), del serije Java (//www.aw.com/cp /javaseries.html), od Addison-Wesley, je dokončna referenca za navidezni stroj Java.
  • Prejšnji članki "Pod pokrovom":
  • "Lean, Mean Virtual Machine" predstavlja uvod v navidezni stroj Java.
  • "Življenjski slog datoteke razreda Java" Daje pregled datoteke razreda Java, oblike datoteke, v katero so zbrani vsi programi Java.
  • "Java's Garbage-Collected Heap" Daje pregled zbiranja smeti na splošno in zlasti kopičene smeti navideznega stroja Java.
  • "Osnove bajtkode" predstavlja bajtode navideznega stroja Java in obravnava predvsem primitivne tipe, operacije pretvorbe in operacije sklada.
  • "Arithmetic s plavajočo vejico" Opisuje podporo za plavajočo vejico navideznega računalnika Java in bajtode, ki izvajajo operacije s plavajočo vejico.
  • "Logic and Arithmetic" Opisuje podporo Java navideznega računalnika za logično in celoštevilčno aritmetiko ter s tem povezane bajtode.
  • "Predmeti in nizi" Opisuje, kako navidezni stroj Java obravnava predmete in nize, ter obravnava ustrezne bajtode.
  • "Izjeme" Opisuje, kako navidezni stroj Java obravnava izjeme, in obravnava ustrezne bajtode.
  • "Poskusi končno" Opisuje, kako navidezni stroj Java izvaja klavzule poskusi končno, in razpravlja o ustreznih bajtkodah.
  • "Control Flow" opisuje, kako Java navidezni stroj izvaja nadzorni tok, in obravnava ustrezne bajtode.
  • "Arhitektura Agletsa" opisuje notranje delovanje Agletsa, IBM-ove avtonomne tehnologije programske opreme, ki temelji na Javi.
  • "The Point of Aglets" analizira dejansko uporabnost mobilnih agentov, kot je Aglets, IBM-ova avtonomna tehnologija programske opreme, ki temelji na Javi.
  • "Priklic in vrnitev metode" Pojasnjuje, kako navidezni stroj Java prikliče in se vrne iz metod, vključno z ustreznimi bajtkodami.

To zgodbo, "Kako navidezni stroj Java izvaja sinhronizacijo niti", je prvotno objavil JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found