JavaRush /Java Blog /Random-TK /Akymy dolandyrmak. Üýtgäp durýan açar söz we hasyl () usu...

Akymy dolandyrmak. Üýtgäp durýan açar söz we hasyl () usuly

Toparda çap edildi
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ň . longdouble 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 longwe . doubleNä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. longwe 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:
  1. Elmydama atom taýdan okalar we ýazylar. 64 bitli bolsa-da doubleýa-da long.
  2. Java enjamy keş keşde saklamaz. Şeýlelik bilen, 10 sapak ýerli nusgalary bilen işleýän ýagdaýynda aýrylýar.
Ine, bir sözde iki sany çynlakaý mesele çözülýär :)

hasyl () usuly

Biz eýýäm synpyň köp usullaryna göz aýladyk Thread, ýö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! Akymy dolandyrmak.  Üýtgäp durýan açar söz we hasyl () usuly - 2Hasyl 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-1we Thread-2. Thread-0ilki başlaýar we derrew başgalara ýol berýär. Ondan soň başlaýar Thread-1we ýol berýär. Ondan soň başlaýar Thread-2, bu hem pes. Mundan başga sapaklarymyz ýok, Thread-2iň 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-1ahyryna ç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ň - Awe B. Bu sapaklaryň her biri amallary ýerine ýetirip biler 1we 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 1sapakda 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ň. B2B2А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.

Usuldan Thread.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 çykmazdan run() ozal bolup geçýärjoin() . Iki akymymyza gaýdyp geleliň - Аwe B. Usuly join()şeýle bir atlandyrýarys welin, sapak öz işini Bbitirmezden 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 Asapakda doly görüner .BA

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. Hatda longwe doubleozal 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 zkonsola ç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.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION