Programmēšana

Kā Java virtuālā mašīna veic pavedienu sinhronizāciju

Visas Java programmas tiek apkopotas klases failos, kuros ir baitkodi, Java virtuālās mašīnas mašīnvaloda. Šajā rakstā ir apskatīts, kā pavedienu sinhronizāciju apstrādā Java virtuālā mašīna, ieskaitot attiecīgos baitkodus. (1750 vārdi)

Šī mēneša Zem kapuces aplūko pavedienu sinhronizāciju gan Java valodā, gan Java virtuālajā mašīnā (JVM). Šis raksts ir pēdējais pagājušajā vasarā sāktajā garajā baitkodu rakstu sērijā. Tajā aprakstīti tikai divi opkodi, kas tieši saistīti ar pavedienu sinhronizāciju, opkodi, ko izmanto monitoru ievadīšanai un iziešanai.

Vītnes un koplietoti dati

Viena no Java programmēšanas valodas stiprajām pusēm ir tās atbalsts daudzsavienojumam valodas līmenī. Liela daļa šī atbalsta ir vērsta uz piekļuves koordinēšanu datiem, kas koplietoti starp vairākiem pavedieniem.

JVM organizē darbojošās Java lietojumprogrammas datus vairākos izpildlaika datu apgabalos: vienā vai vairākos Java kaudzēs, kaudzē un metožu apgabalā. Informāciju par šīm atmiņas vietām skatiet pirmajā Zem kapuces raksts: "Liekā, vidējā virtuālā mašīna."

Java virtuālās mašīnas iekšienē katram pavedienam tiek piešķirts a Java kaudze, kurā ir dati, kuriem nevar piekļūt neviens cits pavediens, tostarp katras pavediena izmantotās metodes lokālie mainīgie, parametri un atgriešanās vērtības. Steka dati ir ierobežoti ar primitīviem tipiem un objektu atsaucēm. JVM nav iespējams ievietot faktiskā objekta attēlu uz kaudzes. Visi objekti atrodas uz kaudzes.

Ir tikai viens kaudze JVM iekšienē, un visi pavedieni to kopīgo. Kaudze nesatur neko citu kā priekšmetus. Nekādā gadījumā uz kaudzes nevar ievietot vientuļo primitīvo tipu vai objekta atsauci - šīm lietām jābūt objekta daļai. Masīvi atrodas uz kaudzes, ieskaitot primitīvu veidu masīvus, bet Java arī masīvi ir objekti.

Papildus Java kaudzei un kaudzei citi vietas dati var atrasties JVM metodes apgabals, kurā ir visi programmas izmantotie klases (vai statiskie) mainīgie. Metodes apgabals ir līdzīgs kaudzei, jo tajā ir tikai primitīvi tipi un objektu atsauces. Atšķirībā no kaudzes, tomēr klases mainīgie metodes apgabalā tiek koplietoti visiem pavedieniem.

Objekta un klases slēdzenes

Kā aprakstīts iepriekš, Java virtuālās mašīnas divās atmiņas zonās ir dati, kurus koplieto visi pavedieni. Šie ir:

  • Kaudze, kurā ir visi priekšmeti
  • Metodes apgabals, kurā ir visi klases mainīgie

Ja vairākiem pavedieniem vienlaikus jāizmanto vieni un tie paši objekti vai klases mainīgie, to piekļuve datiem ir pareizi jāpārvalda. Pretējā gadījumā programmai būs neparedzama rīcība.

Lai koordinētu koplietojamu datu piekļuvi starp vairākiem pavedieniem, Java virtuālā mašīna saista a slēdzene ar katru objektu un klasi. Slēdzene ir kā privilēģija, kuru vienlaikus var "piemīt" tikai viens pavediens. Ja pavediens vēlas bloķēt noteiktu objektu vai klasi, tas jautā JVM. Kādā brīdī pēc tam, kad pavediens prasa JVM slēdzeni - varbūt ļoti drīz, varbūt vēlāk, iespējams, nekad - JVM piešķir pavedienam slēdzeni. Kad pavedienam vairs nav nepieciešama slēdzene, tā to atdod JVM. Ja cits pavediens ir pieprasījis to pašu bloķēšanu, JVM nodod bloķēšanu šim pavedienam.

Klases slēdzenes faktiski tiek realizētas kā objektu slēdzenes. Kad JVM ielādē klases failu, tas izveido klases instanci java.lang.Class. Bloķējot klasi, jūs faktiski bloķējat šīs klases Klase objekts.

Vītnēm nav jāsaņem bloķēšana, lai piekļūtu instancēm vai klases mainīgajiem. Ja pavediens tomēr iegūst bloķēšanu, neviens cits pavediens nevar piekļūt bloķētajiem datiem, kamēr pavediens, kuram pieder slēdzene, tos atbrīvo.

Monitori

JVM izmanto slēdzenes kopā ar monitori. Monitors būtībā ir aizbildnis, jo tas uzrauga koda secību, pārliecinoties, ka kodu izpilda tikai viens pavediens vienlaikus.

Katrs monitors ir saistīts ar objekta atsauci. Kad pavediens nonāk pie pirmās instrukcijas koda blokā, kas atrodas monitora uzmanīgajā acī, pavedienam jāsaņem atslēga uz atsauces objektu. Vītnei nav atļauts izpildīt kodu, kamēr tā neiegūst slēdzeni. Kad tas ir ieguvis slēdzeni, pavediens nonāk aizsargātā koda blokā.

Kad pavediens atstāj bloku, neatkarīgi no tā, kā tas atstāj bloku, tas atbrīvo saistītā objekta slēdzeni.

Vairākas slēdzenes

Vienam pavedienam ir atļauts vairākas reizes bloķēt vienu un to pašu objektu. Katram objektam JVM uzskaita objekta bloķēšanas reižu skaitu. Atbloķēta objekta skaits ir nulle. Kad pavediens pirmo reizi iegūst slēdzeni, skaitlis tiek palielināts līdz vienam. Katru reizi, kad pavediens iegūst bloķēšanu vienam un tam pašam objektam, skaitlis tiek palielināts. Katru reizi, kad pavediens atbrīvo slēdzeni, skaits tiek samazināts. Kad skaits sasniedz nulli, slēdzene tiek atbrīvota un pieejama citiem pavedieniem.

Sinhronizēti bloki

Java valodas terminoloģijā tiek izsaukta vairāku pavedienu koordinācija, kuriem ir jāpiekļūst koplietotajiem datiem sinhronizācija. Valoda nodrošina divus iebūvētus veidus, kā sinhronizēt piekļuvi datiem: ar sinhronizētiem paziņojumiem vai sinhronizētām metodēm.

Sinhronizēti paziņojumi

Lai izveidotu sinhronizētu paziņojumu, izmantojiet sinhronizēts atslēgvārds ar izteicienu, kas novērtē objekta atsauci, kā tas ir apgrieztā secībā() metode:

klase KitchenSync {private int [] intArray = new int [10]; void reverseOrder () {sinhronizēts (šis) {int halfWay = intArray.length / 2; par (int i = 0; i <halfWay; ++ i) {int upperIndex = intArray.length - 1 - i; int save = intArray [upperIndex]; intArray [upperIndex] = intArray [i]; intArray [i] = saglabāt; }}}}

Iepriekš minētajā gadījumā sinhronizētajā blokā esošie paziņojumi netiks izpildīti, kamēr pašreizējam objektam nav iegūta bloķēšana (šo). Ja a vietā šo atsauce, izteiksme deva atsauci uz citu objektu, ar šo objektu saistītā slēdzene tiks iegūta pirms pavediena turpināšanas.

Divi opkodi, monitorenter un monitorexit, tiek izmantoti metriku sinhronizācijas blokiem, kā parādīts zemāk esošajā tabulā.

1. tabula. Monitori

OpcodeOperands (-i)Apraksts
monitorenternevienapop objectref, iegūstiet ar objektref saistīto slēdzeni
monitorexitnevienapop objectref, atlaidiet bloķēšanu, kas saistīta ar objectref

Kad monitorenter saskaras ar Java virtuālo mašīnu, tā iegūst objekta bloķēšanu, uz kuru kaudzē norāda objectref. Ja pavedienam jau pieder šī objekta bloķēšana, skaitlis tiek palielināts. Katru reizi monitorexit tiek izpildīts objekta pavedienam, skaitlis tiek samazināts. Kad skaitīšana sasniedz nulli, monitors tiek atbrīvots.

Aplūkojiet bytecode secību, ko ģenerē apgrieztā secībā() metode KitchenSync klasē.

Ņemiet vērā, ka fiksēšanas klauzula nodrošina bloķētā objekta atbloķēšanu pat tad, ja sinhronizētajā blokā tiek izmests izņēmums. Neatkarīgi no tā, kā tiek iziets no sinhronizētā bloka, objekta bloķēšana, kas iegūta, kad pavediens ienāca blokā, noteikti tiks atbrīvots.

Sinhronizētas metodes

Lai sinhronizētu visu metodi, jums vienkārši jāiekļauj sinhronizēts atslēgvārds kā viens no metodes kvalifikatoriem, kā:

klase HeatSync {private int [] intArray = new int [10]; sinhronizēts void reverseOrder () {int halfWay = intArray.length / 2; par (int i = 0; i <halfWay; ++ i) {int upperIndex = intArray.length - 1 - i; int save = intArray [upperIndex]; intArray [upperIndex] = intArray [i]; intArray [i] = saglabāt; }}}

JVM neizmanto īpašus opkodus, lai izsauktu vai atgrieztos no sinhronizētajām metodēm. Kad JVM atrisina simbolisko atsauci uz metodi, tā nosaka, vai metode ir sinhronizēta. Ja tā ir, pirms metodes izsaukšanas JVM iegūst bloķēšanu. Piemēra metodei JVM iegūst bloķēšanu, kas saistīta ar objektu, uz kuru tiek izsaukta metode. Klases metodei tā iegūst slēdzeni, kas saistīta ar klasi, kurai metode pieder. Pēc tam, kad sinhronizētā metode ir pabeigta, neatkarīgi no tā, vai tā tiek pabeigta, atgriežoties vai izmetot izņēmumu, bloķēšana tiek atbrīvota.

Nākamajā mēnesī

Tagad, kad esmu izgājis visu baitkodu instrukciju kopu, es paplašināšu šīs slejas darbības jomu, iekļaujot dažādus Java tehnoloģijas aspektus vai lietojumprogrammas, ne tikai Java virtuālo mašīnu. Nākamajā mēnesī es sākšu daudzdaļīgu sēriju, kas sniedz padziļinātu pārskatu par Java drošības modeli.

Bils Venners programmatūru profesionāli raksta 12 gadus. Atrodas Silīcija ielejā, viņš sniedz programmatūras konsultēšanas un apmācības pakalpojumus ar nosaukumu Artima Software Company. Gadu gaitā viņš ir izstrādājis programmatūru plaša patēriņa elektronikas, izglītības, pusvadītāju un dzīvības apdrošināšanas nozarēm. Viņš ir ieprogrammējis daudzās valodās uz daudzām platformām: montāžas valoda uz dažādiem mikroprocesoriem, C uz Unix, C ++ uz Windows, Java tīmeklī. Viņš ir grāmatas McGraw-Hill izdotās grāmatas: Inside the Java Virtual Machine autors.

Uzziniet vairāk par šo tēmu

  • Grāmata Java virtuālās mašīnas specifikācija (//www.aw.com/cp/lindholm-yellin.html), autori: Tim Lindholm un Frank Yellin (ISBN 0-201-63452-X), daļa no Java sērijas (//www.aw.com/cp /javaseries.html) no Addison-Wesley ir galīgā Java virtuālās mašīnas atsauce.
  • Iepriekšējie raksti "Zem pārsega":
  • "Lean, Mean Virtual Machine" sniedz ievadu Java virtuālajai mašīnai.
  • "Java klases failu dzīvesveids" sniedz pārskatu par Java klases failu, faila formātu, kurā apkopotas visas Java programmas.
  • "Java atkritumu savāktais kaudze" sniedz pārskatu par atkritumu savākšanu kopumā un jo īpaši Java virtuālās mašīnas atkritumu savākto kaudzi.
  • "Bytecode Basics" iepazīstina ar Java virtuālās mašīnas baitkodiem un īpaši apspriež primitīvos veidus, konvertēšanas operācijas un kaudzes operācijas.
  • "Peldošo punktu aritmētika" Apraksta Java virtuālās mašīnas peldošā komata atbalstu un baitkodus, kas veic peldošā komata operācijas.
  • "Loģika un aritmētika" Apraksta Java virtuālās mašīnas atbalstu loģiskai un veselai skaitļai aritmētikai, kā arī saistītos baitkodus.
  • "Objekti un masīvi" Apraksta, kā Java virtuālā mašīna rīkojas ar objektiem un masīviem, un apspriež attiecīgos baitkodus.
  • "Izņēmumi" Apraksta, kā Java virtuālā mašīna rīkojas ar izņēmumiem, un apspriež attiecīgos baitkodus.
  • "Mēģināt-beidzot" Apraksta, kā Java virtuālā mašīna ievieš izmēģinājuma klauzulas, un apspriež attiecīgos baitkodus.
  • "Vadības plūsma" Apraksta, kā Java virtuālā mašīna īsteno vadības plūsmu, un apspriež attiecīgos baitkodus.
  • "Aglets arhitektūra" apraksta IBM autonomās Java programmatūras aģentu tehnoloģijas Aglets iekšējo darbību.
  • "Aglets punkts" analizē mobilo aģentu, piemēram, Aglets, IBM autonomās Java programmatūras aģentu tehnoloģijas reālo pasauli.
  • "Metodes izsaukšana un atgriešana" Paskaidro, kā Java virtuālā mašīna izsauc un atgriežas no metodēm, ieskaitot attiecīgos baitkodus.

Šo stāstu "Kā Java virtuālā mašīna veic pavedienu sinhronizāciju" sākotnēji publicēja JavaWorld.

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