arsitektur hardware memori
Arsitektur hardware memori modern beda karo model memori internal Jawa. Mulane, sampeyan kudu ngerti arsitektur hardware supaya ngerti carane model Jawa dianggo karo. Bagian iki njlèntrèhaké arsitektur hardware memori umum, lan bagean sabanjuré njlèntrèhaké carane Jawa dianggo karo.
Punika diagram prasaja babagan arsitektur hardware komputer modern:
![arsitektur hardware memori](https://cdn.codegym.cc/images/article/0a28b119-0299-42d8-aab3-fba135d16288/512.jpeg)
Ing donya modern, komputer duwe 2 utawa luwih prosesor lan iki wis dadi norma. Sawetara prosesor kasebut bisa uga duwe sawetara inti. Ing komputer kasebut, bisa mbukak pirang-pirang utas ing wektu sing padha. Saben inti prosesor bisa nindakake siji utas ing wektu tartamtu. Iki tegese aplikasi Java apa wae minangka priori multi-threaded, lan ing program sampeyan, siji utas saben inti prosesor bisa mlaku bebarengan.
Inti prosesor ngemot sakumpulan register sing manggon ing memori (ing inti). Iku nindakake operasi ing ndhaftar data luwih cepet tinimbang ing data sing manggon ing memori utama komputer (RAM). Iki amarga prosesor bisa ngakses ndhaftar iki luwih cepet.
Saben CPU uga bisa duwe lapisan cache dhewe. Paling prosesor modern duwe. Prosesor bisa ngakses cache luwih cepet tinimbang memori utama, nanging ora cepet kaya registrasi internal. Nilai saka kacepetan akses cache kira-kira antarane kacepetan akses saka memori utama lan ndhaftar internal.
Kajaba iku, prosesor duwe papan sing duwe cache multi-level. Nanging iki ora dadi penting kanggo ngerti supaya ngerti carane model memori Jawa sesambungan karo memori hardware. Iku penting kanggo ngerti sing prosesor uga duwe sawetara tingkat saka cache.
Sembarang komputer uga ngemot RAM (area memori utama) kanthi cara sing padha. Kabeh intine bisa ngakses memori utama. Wilayah memori utama biasane luwih gedhe tinimbang memori cache inti prosesor.
Ing wayahe nalika prosesor perlu akses menyang memori utama, maca bagean menyang memori cache sawijining. Uga bisa maca sawetara data saka cache menyang ndhaftar internal lan banjur nindakake operasi ing. Nalika CPU kudu nulis asil bali menyang memori utama, bakal siram data saka register internal kanggo cache, lan ing sawetara titik, menyang memori utama.
Data sing disimpen ing cache biasane disiram maneh menyang memori utama nalika prosesor kudu nyimpen barang liya ing cache. Cache nduweni kemampuan kanggo mbusak memori lan nulis data ing wektu sing padha. Prosesor ora perlu maca utawa nulis cache lengkap saben wektu nalika nganyari. Biasane cache dianyari ing pamblokiran cilik saka memori, padha disebut "line cache". Siji utawa luwih "garis cache" bisa diwaca menyang memori cache, lan siji utawa luwih garis cache bisa dibuang maneh menyang memori utama.
Nggabungke model memori Jawa lan arsitektur hardware memori
Kaya sing wis kasebut, model memori Jawa lan arsitektur hardware memori beda. Arsitektur hardware ora mbedakake antarane tumpukan thread lan tumpukan. Ing hardware, tumpukan benang lan HEAP (heap) manggon ing memori utama.
Bagean tumpukan lan tumpukan benang bisa uga ana ing cache lan register internal CPU. Iki ditampilake ing diagram:
![tumpukan thread lan HEAP](https://cdn.codegym.cc/images/article/7b653255-07de-4c9b-b6c0-9c47c7e6cd44/1024.jpeg)
Nalika obyek lan variabel bisa disimpen ing macem-macem wilayah ing memori komputer, masalah tartamtu bisa muncul. Ing ngisor iki loro sing utama:
- Visibilitas owah-owahan sing wis digawe thread menyang variabel sing dienggo bareng.
- Kondisi balapan nalika maca, mriksa lan nulis variabel sing dienggo bareng.
Loro-lorone masalah kasebut bakal dijlentrehake ing ngisor iki.
Visibilitas Obyek sing Dibagi
Yen loro utawa luwih utas nuduhake obyek tanpa nggunakake deklarasi molah malih utawa sinkronisasi sing tepat, owah-owahan ing obyek sing dienggo bareng sing digawe dening siji utas bisa uga ora katon ing benang liyane.
Mbayangno yen obyek sing dienggo bareng pisanan disimpen ing memori utama. Utas sing mlaku ing CPU maca obyek sing dienggo bareng menyang cache saka CPU sing padha. Ing kana dheweke nggawe owah-owahan ing obyek kasebut. Nganti cache CPU wis disiram menyang memori utama, versi sing diowahi saka obyek sing dienggo bareng ora katon ing benang sing mlaku ing CPU liyane. Mangkono, saben thread bisa entuk salinan obyek sing dienggo bareng, saben salinan bakal ana ing cache CPU sing kapisah.
Diagram ing ngisor iki nggambarake gambaran saka kahanan iki. Siji thread sing mlaku ing CPU kiwa nyalin obyek sing dienggo bareng menyang cache lan ngganti nilai count dadi 2. Owah-owahan iki ora katon ing thread liyane sing mlaku ing CPU tengen amarga nganyari kanggo count durung disiram maneh menyang memori utama.
![](https://cdn.codegym.cc/images/article/c4ba107f-a25e-496d-af1a-4e7128d00d0e/800.jpeg)
Kanggo ngatasi masalah iki, sampeyan bisa nggunakake tembung kunci sing molah malih nalika ngumumake variabel. Bisa mesthekake yen variabel diwenehi diwaca langsung saka memori utama lan tansah ditulis bali menyang memori utama nalika dianyari.
Kondisi balapan
Yen loro utawa luwih utas nuduhake obyek sing padha lan luwih saka siji utas nganyari variabel ing obyek sing dienggo bareng, mula kahanan balapan bisa kedadeyan.
Mbayangno yen thread A maca variabel count obyek sing dienggo bareng menyang cache prosesor. Mbayangno uga sing thread B nindakake bab sing padha, nanging ing cache prosesor liyane. Saiki thread A nambah 1 menyang Nilai count, lan thread B nindakake padha. Saiki variabel wis tambah kaping pindho - kanthi kapisah +1 ing cache saben prosesor.
Yen tambahan iki dileksanakake sequentially, variabel count bakal tikel kaping pindho lan ditulis bali menyang memori utama (nilai asli + 2).
Nanging, rong tambahan ditindakake bebarengan tanpa sinkronisasi sing tepat. Preduli saka thread (A utawa B) nulis versi dianyari saka count kanggo memori utama, bakal Nilai anyar mung 1 luwih saka Nilai asli, senadyan loro tambahan.
Diagram iki nggambarake kedadeyan masalah kondisi balapan sing diterangake ing ndhuwur:
![](https://cdn.codegym.cc/images/article/37347ace-af3d-4648-a218-18f8c1576289/800.jpeg)
Kanggo ngatasi masalah iki, sampeyan bisa nggunakake blok sinkronisasi Java. Blok sing disinkronake mesthekake yen mung siji utas bisa ngetik bagean kritis kode ing wektu tartamtu.
pamblokiran diselarasake uga njamin sing kabeh variabel diakses nang pemblokiran diselarasake bakal diwaca saka memori utama, lan nalika thread metu saka pamblokiran diselarasake, kabeh variabel dianyari bakal flushed bali menyang memori utama, preduli saka variabel diumumake molah malih utawa No.