Salam! Köp okalmagy öwrenmegi dowam etdirýäris we bu gün täze açar söz - üýtgäp durýan we hasyl () usuly bilen tanyşarys. Onuň nämedigini anyklalyň :)
Açar söz üýtgewsiz
Köp sapakly programmalar döredilende iki sany çynlakaý meselä duçar bolup bileris. Ilki bilen, köp sapakly programmanyň işleýşi wagtynda dürli sapaklar üýtgeýänleriň bahalaryny keş edip biler (bu barada “Üýtgäp durmak” leksiýasynda has giňişleýin gürleşeris ). Bir sapak üýtgeýjiniň bahasyny üýtgeden bolmagy ähtimal, ýöne ikinjisi bu üýtgeýjini görmedi, sebäbi üýtgeýjiniň öz keş görnüşli nusgasy bilen işleýärdi. Elbetde, netijeleri çynlakaý bolup biler. Munuň diňe bir “üýtgeýän” bolman, eýsem, tötänleýin tötänleýin böküp başlaýan bank kartyňyzyň balansydygyny göz öňüne getiriň :) Gaty ýakymly däl, şeýlemi? Ikinjiden, Java-da atomdan başga ähli görnüşdäki amallary okaň we ýazyň .long
double
Atom näme? Mysal üçin, bir üýtgeýjiniň bahasyny bir sapakda üýtgeden bolsaňyz int
, başga bir sapakda bu üýtgeýjiniň bahasyny okasaňyz, köne bahasyny ýa-da täzesini alarsyňyz - üýtgäninden soň ýüze çykan sapak 1. Ol ýerde hiç hili "aralyk wariant" peýda bolmaz. Şeýle-de bolsa, bu işlemeýär long
we . double
Näme üçin? Sebäbi bu platforma. Birinji derejelerde Java ýörelgesiniň “bir gezek ýazylýar, hemme ýerde işleýär” diýendigimizi ýadyňyzdamy? Bu platforma. Javaagny, Java programmasy düýbünden başga platformalarda işleýär. Mysal üçin, Windows operasiýa ulgamlarynda Linux ýa-da MacOS-yň dürli wersiýalary we bu programma hemme ýerde durnukly işlär. long
we double
- Java-da iň “agyr” başlangyçlar: agramy 64 bit. Käbir 32 bitli platformalar 64 bitli üýtgeýänleri okamagyň we ýazmagyň atomlygyny amala aşyrmaýarlar. Şeýle üýtgeýjiler iki amalda okalýar we ýazylýar. Ilki bilen 32 bit üýtgeýjä, soň ýene 32-e ýazylýar. Şoňa görä bu ýagdaýlarda bir mesele ýüze çykyp biler. Bir sapak üýtgeýjä 64 bitlik baha ýazýarХ
we muny "iki ädimde" edýär. Şol bir wagtyň özünde, ikinji sapak bu üýtgeýjiniň bahasyny okamaga synanyşýar we ilkinji 32 bit eýýäm ýazylan, ýöne ikinjisi entek ýazylmadyk wagtynda ortada edýär. Netijede, aralyk, nädogry baha okalýar we ýalňyşlyk ýüze çykýar. Mysal üçin, şeýle platformada üýtgeýjä san ýazmaga synanyşsak - 9223372036854775809 - 64 bit tutar. Ikitaraplaýyn görnüşde şeýle bolar: 100000000000000000000000000000000000000000000001 Birinji sapak bu belgini üýtgeýjä ýazyp başlar we ilki ilkinji 32 bit ýazar: 1000000000000000000000000000 00000, soň bolsa ikinji 32: 00000000000000000000000000000000 üýtgeýjiniň aralyk bahasyny okaň - 10000000000000000000000000000000000, eýýäm ýazylan ilkinji 32 bit. Onluk ulgamynda bu san 2147483648-e deňdir. .Agny, diňe 9223372036854775809 belgisini üýtgeýjä ýazmak isledik, ýöne käbir platformalarda bu amalyň atom däldigi sebäpli 2147483648 “çep” belgini aldyk bize zerur däl, hiç ýerden ýok. we programmanyň işine nähili täsir etjekdigi belli däl. Ikinji sapak, üýtgeýjiniň bahasyny ýazylmazdan ozal okady, ýagny ilkinji 32 biti gördi, ýöne ikinji 32 bit däl. Elbetde, bu meseleler düýn ýüze çykmady we Java-da diňe bir açar söz - üýtgewsiz söz bilen çözülýär . Programmamyzda üýtgewsiz söz bilen käbir üýtgeýjini yglan etsek ...
public class Main {
public volatile long x = 2222222222222222222L;
public static void main(String[] args) {
}
}
... munuň manysy:
- Elmydama atom taýdan okalar we ýazylar. 64 bitli bolsa-da
double
ýa-dalong
. - Java enjamy keş keşde saklamaz. Şeýlelik bilen, 10 sapak ýerli nusgalary bilen işleýän ýagdaýynda aýrylýar.
hasyl () usuly
Biz eýýäm synpyň köp usullaryna göz aýladykThread
, ýöne siziň üçin täze boljak möhüm bir usul bar. Bu hasyl () usulydyr . Iňlis dilinden “ber” diýip terjime edildi. Usulyň edil şonuň ýaly! Hasyl usulyny bir sapakda çagyranymyzda, aslynda beýleki sapaklara şeýle diýilýär: “Bolýar, ýigitler, men howlukmaýaryn, şonuň üçin haýsydyr biriňiz üçin CPU wagtyny almak möhüm bolsa, alyň, men gyssagly däl. ” Ine, onuň işleýşiniň ýönekeý mysaly:
public class ThreadExample extends Thread {
public ThreadExample() {
this.start();
}
public void run() {
System.out.println(Thread.currentThread().getName() + "give way to others");
Thread.yield();
System.out.println(Thread.currentThread().getName() + " has finished executing.");
}
public static void main(String[] args) {
new ThreadExample();
new ThreadExample();
new ThreadExample();
}
}
Üç sapak yzygiderli döredýäris we işe girizýäris Thread-0
- Thread-1
we Thread-2
. Thread-0
ilki başlaýar we derrew başgalara ýol berýär. Ondan soň başlaýar Thread-1
we ýol berýär. Ondan soň başlaýar Thread-2
, bu hem pes. Mundan başga sapaklarymyz ýok, Thread-2
iň soňkusy ýerinden ýüz öwürenden soň, sapak meýilleşdirijisi: “Diýmek, täze sapaklar ýok, nobatda kim bar? Öň ýerinden ýüz öwüren iň soňky kim boldy Thread-2
? Meniň pikirimçe Thread-1
? Bolýar, ýerine ýetirilsin. ” Thread-1
ahyryna çenli öz işini edýär, şondan soň sapak meýilleşdirijisi utgaşmagy dowam etdirýär: “Bolýar, sapak-1 gutardy. Başga nobatda barmy? " Nobatda “Thread-0” bar: “Thread-1” -den öň derrew ýerini berdi. Indi mesele oňa geldi we ahyryna çenli amala aşyrylýar. Ondan soň meýilleşdiriji sapaklary utgaşdyrmagy tamamlaýar: “Bolýar, sapak-2, beýleki sapaklara ýol berdiňiz, hemmesi eýýäm işledi. Iň soňky ýol berdiňiz, indi nobatyňyz geldi. ” Ondan soň, “Thread-2” tamamlanýar. Konsol çykyşy şeýle bolar: Thread-0 başgalara ýol berýär Thread-1 başgalara ýol berýär Thread-2 başgalara ýol berýär Thread-1 ýerine ýetirmegi tamamlady. Thread-0 ýerine ýetirip gutardy. “Thread-2” ýerine ýetirip gutardy. Elbetde, sapak meýilleşdirijisi sapaklary başga tertipde işledip biler (mysal üçin, 0-1-2 ýerine 2-1-0), ýöne prinsip birmeňzeş.
Düzgünlerden öň bolup geçýär
Bu gün iň soňky degip geçjek zadymyz " öň bolup geçýär " ýörelgeleri. Öňden bilşiňiz ýaly, Java-da, wezipelerini ýerine ýetirmek üçin sapaklara wagt we serişde bölmek işleriniň köpüsi sapak meýilleşdirijisi tarapyndan amala aşyrylýar. Mundan başga-da, sapaklaryň özbaşdak tertipde ýerine ýetirilişini birnäçe gezek gördüňiz we köplenç muny çaklamak mümkin däl. Umuman aýdanyňda, öň eden “yzygiderli” programmirlemegimizden soň, köp okamak tötänleýin bir zada meňzeýär. Öň görşüňiz ýaly, köp okalýan programmanyň gidişine ähli usullar toplumyny ulanyp gözegçilik edip bolýar. Emma muňa goşmaça, Java köp okalýan ýerde ýene bir “durnuklylyk adasy” bar - “ öňem bolýar ” diýilýän 4 düzgün. Göçme manyda Iňlis dilinden bu “öň bolýar” ýa-da “öň bolýar” ýaly terjime edilýär. Bu düzgünleriň manysyna düşünmek gaty ýönekeý. Iki sapak bar diýip göz öňüne getiriň -A
we B
. Bu sapaklaryň her biri amallary ýerine ýetirip biler 1
we 2
. Düzgünleriň her birinde “ B-den öň bolup geçýärA
” diýlende, bu amaldan öň sapak tarapyndan edilen ähli üýtgeşmeler we bu amal bilen baglanyşykly üýtgeşmeler , amal ýerine ýetirilende 1
sapakda görünýär we operasiýa edilenden soň. Bu düzgünleriň her biri, köp sapakly programma ýazylanda käbir hadysalaryň beýlekileriň 100% wagtyndan öň bolup geçjekdigini we amal wagtynda sapagyň sapagyň eden üýtgeşmelerinden elmydama habarly bolmagyny üpjün edýär. . Geliň, olara seredeliň. B
2
B
2
А
1
1-nji düzgün.
Muteksiň çykmagy başga bir sapak şol bir monitory almazdan ozal bolup geçýär . Dogrusy, bu ýerde hemme zat düşnükli ýaly. Bir obýektiň ýa-da synpyň muteeksini bir sapak, mysal üçin bir sapakА
, başga bir sapak (sapak B
) şol bir wagtda alyp bilmez. Muteks çykýança garaşmaly.
2-nji düzgün.
UsuldanThread.start()
öň bolup geçýär Thread.run()
. Hiç hili çylşyrymly zat ýok. Siz eýýäm bilýärsiňiz: usulyň içindäki kody ýerine ýetirip başlamak üçin run()
usuly sapakda çagyrmaly start()
. Usulyň özi däl-de, onuňky run()
! Bu düzgün, Thread.start()
ýerine ýetirilmezden ozal kesgitlenen ähli üýtgeýänleriň bahalarynyň ýerine ýetirilip başlanan usulyň içinde görünmegini üpjün edýär run()
.
3-nji düzgün.
Usuly gutarmak usul çykmazdanrun()
ozal bolup geçýärjoin()
. Iki akymymyza gaýdyp geleliň - А
we B
. Usuly join()
şeýle bir atlandyrýarys welin, sapak öz işini B
bitirmezden ozal garaşmaly A
. run()
Bu, A obýektiň usulynyň ahyryna çenli hökman işlejekdigini aňladýar . run()
Sap usulynda bolup geçýän maglumatlardaky ähli üýtgeşmeler, tamamlanmagyna garaşýan we özi işläp başlanda A
sapakda doly görüner .B
A
4-nji düzgün.
Üýtgeýän üýtgeýjä ýazmak, şol üýtgeýjiden okamazdan ozal bolýar . Üýtgäp durýan açar söz ulanyp, aslynda häzirki bahany alarys. Hatdalong
we double
ozal ara alnyp maslahatlaşylan meseleler. Öň düşünşiňiz ýaly, käbir sapaklarda edilen üýtgeşmeler hemişe beýleki sapaklara görünmeýär. , Öne, elbetde, şeýle programma häsiýetiniň bize laýyk gelmeýän ýagdaýlary köplenç bolýar. Bir sapakdaky üýtgeýjä baha belledik diýeliň A
:
int z;
….
z= 555;
Biziň sapagymyz B
üýtgeýjiniň bahasyny z
konsola çap etmeli bolsa, aňsatlyk bilen 0 çap edip bilerdi, sebäbi özüne berlen bahany bilmeýär. Şeýlelik bilen, 4-nji düzgün bize kepil geçýär: üýtgeýjini üýtgewsiz diýip yglan etseňiz z
, bir sapakdaky bahalaryna üýtgeşmeler hemişe başga bir sapakda görüner. Öňki koda üýtgewsiz söz goşsak ...
volatile int z;
….
z= 555;
B
... akymyň konsola 0 çykarjak ýagdaýy aýrylýar. Üýtgeýän üýtgeýänlere ýazmak, olardan öň okalýar.
GO TO FULL VERSION