— Salam, Amigo! Bizde ähli meseläni çözýän derman bar. Biz eýýäm synag etdik – garaşsyz ýagdaýda ýipleriň geçişi – bu bir mesele.
— Näme üçin ýipler öz başlaryna kararyp, haçan geçmelidigine karar bermänoklar? Ähli möhüm işleri ýerine ýetirip, "Bolýar" diýip bilýärler!
— Ýiplere öz geçişlerini dolandyrmaga rugsat bermek – has uly mesele. Birden bir kod gowşak ýazylsa we ýip öz "prosessoryň wagtyny" hiç haçan daşyna çykarmaz. Öňler şeýle bolupdy – we bu bir sessiz gorky.
— Bolýar. We näme çözgüt bar?
— Ýipleriň blokirlenmesi. Ine, nähili işleýär.
Anyklanyldy, ýipler biri-birine päsgel berýär, umumy obýektler we/ýa-da resurslar bilen işleşýänlerinde. Konsolda çykarmak mysarynda bolşy ýaly: konsol bir, hemme ýipler oňa ýazýarlar. Bu bir tertipsizlik.
Şonuň üçin ýörite obýekt – mutex oýlanyp tapyldy. Bu hajathanyň gapysynda "boş" we "meşgul" diýen tapgyç ýaly. Iki ýagdaýy bar – obýekt boş we obýekt meşgul, ýa-da olaryň başgaça atlandyrylşy blokirlenen we blokirlenmedik.
Haçan-da bir ýipiň hemmeler üçin umumy bolan bir obýekte ýa-da resurslara mätäçligi ýüze çykanda, ol bu obýekt bilen bagly mutex-i gözden geçirýär. Eger mutex boş bolsa, onda ýip ony blokirleýär (meşgul edip belleýär) we umumy resursy ulanmaga başlaýar. Işlerini bitirdikden soň, mutex blokirlenmeýär (boş edip bellener).
Ýöne, ýip obýekti ulanmak isleýär, emma mutex blokirlenen bolsa, onda ýip garaşmak üçin uklap galýar. Ahyrynda, mutex iş ýerini azat edende, biziň ýipimiz derrew ony blokirleýär we işine başlaýar. Tamamlanan hajathana üçin tapgyç analoýasy bilen bir.
— Bu mutex bilen nähili işleşmeli? Ýörite obýektleri döretmeli mi?
— Hemmesi has ýönekeý. Java-nyň işläp düzüjileri bu mutex-i Object klassyna birikdirdiler. Saňa ony döretmegiň geregi ýok. Her bir obýektdä bar. Ine, nähili işleýär:
Kod | Düşündiriş |
---|---|
|
swap metody name1 & name2 üýtgedýän. Eger iki ýip bilen bir wagtda çagyrsaň näme bolar? |
Netije tertibi | Birinji ýip kody | Ikinji ýip kody |
---|---|---|
|
|
|
Netije |
---|
Dürli ýerlerde iki gezek üýtgedilip, başdaky ýerine getirilýär. |
Synchronized açary sözine üns beriň.
— Hawa, bu näme diýmek?
— Haçan bir ýip synchronized diýlen kodyň içine girse, Java maşyn derrew obýektiň mutexini blokirleýär, bu sözden soň töweregiň içinde görkezilen. Başga ýip bu bloga girip bilmez, ta ki biziň ýibimiz çykýança. Haçan biziň ýibimiz blogdan çykarsa, mutex awtomatiki blokirlenmeýär we başga ýipler üçin açylýar.
Eger mutex meşgul bolsa, onda biziň ýibimiz ýolda durup garaşjak.
— Şeýlebir ýönekeý we owadan çözgüt. Gözellik!
— Howwa. Şu ýagdaýda näme bolar diýip pikir edýän?
Kod | Düşündiriş |
---|---|
|
swap we swap2 metodlarynyň mutexi bir – obýekt this. |
Eger bir ýip swap metody çagyrsa, başga biri bolsa swap2 çagyrsa näme bolar?
— Çünki olaryň bir mutexi bar, beýleki ýip synchronized blogyndan çykýança garaşmaly boljak, şol sebäpden bilelikde kullanmakda mesele ýok.
— Aferin, Amigo! Dogry çözgüt!
Siziň ünsümi çekmek isleýärin, synchronized sözi bir bölek kody we bir metody belläp biler. Ine, bu näme diýmek:
Kod | Aslynda näme bolup geçýär |
---|---|
|
|
GO TO FULL VERSION