JavaRush /Java Blog /Random-TK /Tekstiň sinhronizasiýasy. Java-da sinhronlaşdyrylan opera...

Tekstiň sinhronizasiýasy. Java-da sinhronlaşdyrylan operator

Toparda çap edildi
Salam! Bu gün köp sapakly programmirlemegiň aýratynlyklaryna seredip, sapaklaryň sinhronizasiýasy barada gürleşeris.
Tekstiň sinhronizasiýasy.  Operator sinhronlaşdyryldy - 1
“Sinhronizasiýa” näme? Programmirleme çäginiň daşynda, bu iki enjamyň ýa-da programmanyň bilelikde işlemegine mümkinçilik berýän haýsydyr bir gurnama degişlidir. Mysal üçin, smartfon we kompýuter Google hasaby bilen sinhronlaşdyrylyp bilner, web sahypasyndaky şahsy hasap bolsa, olary ulanmak üçin girmek üçin sosial ulgamlardaky hasaplar bilen sinhronlaşdyrylyp bilner. Saplaryň sinhronizasiýasynyň meňzeş manysy bar: sapaklaryň biri-biri bilen nähili täsirleşýändigini düzýär. Öňki leksiýalarda sapaklarymyz biri-birinden aýry ýaşaýardy we işleýärdi. Biri bir zady sanap otyrdy, ikinjisi uklap ýatyrdy, üçünjisi konsolda bir zat görkezýärdi, ýöne biri-biri bilen täsirleşmedi. Hakyky programmalarda beýle ýagdaýlar seýrek bolýar. Birnäçe sapak işjeň işläp biler, mysal üçin, birmeňzeş maglumatlar toplumy bilen we içindäki bir zady üýtgedip biler. Bu problemalary döredýär. Birnäçe sapagyň tekst faýly ýa-da konsol ýaly bir ýere tekst ýazýandygyny göz öňüne getiriň. Bu ýagdaýda bu faýl ýa-da konsol umumy çeşmä öwrülýär. Saplar biri-biriniň barlygy barada bilmeýärler, şonuň üçin sapak meýilleşdirijisiniň özlerine bölüp berjek wagtlarynda mümkin bolan zatlary ýazýarlar. Recentakynda geçirilen leksiýada munuň nämä eltjekdigini mysal aldyk, ýadymyzdan çykarmaň: Tekstiň sinhronizasiýasy.  Sinhronlaşdyrylan operator - 2Sebäbi sapaklaryň biri-biri bilen hereketleri utgaşdyrmazdan umumy çeşme, konsol bilen işlemegidir. Eger sapak meýilleşdiriji “Thread-1” -e wagt bölüp beren bolsa, derrew hemme zady konsola ýazýar. Beýleki sapaklaryň eýýäm ýazmagy başaran ýa-da ýazyp bilmedikleri möhüm däl. Görşüňiz ýaly netije zyýanly. Şonuň üçin köp sapakly programmirlemekde ýörite “ mutex” düşünjesi girizildi (iňlis dilinden “mutex”, “özara aýyrmak” - “özara aýyrmak”) . Muteksiň maksady, diňe bir sapagyň belli bir wagtda bir obýekte girip bilmegi üçin mehanizm bermekdir. “Thread-1” A obýektiň muteeksini alan bolsa, beýleki sapaklar içindäki zatlary üýtgetmek üçin oňa girip bilmezler. “A” mutex obýekti çykýança, galan sapaklar garaşmaga mejbur bolar. Hakyky durmuş mysaly: siz we başga-da 10 nätanyş bir türgenleşige gatnaşýandygyňyzy göz öňüne getiriň. Pikirleri beýan etmek we bir zatlar hakda pikir alyşmak üçin nobatçylyk etmeli. Emma, ​​birek-biregi yzygiderli kesmezlik we merkeze düşmezlik üçin ilkinji gezek biri-biriňizi görýänligiňiz sebäpli, “gürleýän top” düzgünini ulanýarsyňyz: diňe bir adam gürläp biler - topy bar elleri. Şeýlelik bilen çekişme ýeterlik we netijeli bolýar. Diýmek, mutex, şunuň ýaly top. Bir obýektiň muteeksi bir sapagyň elinde bolsa, beýleki sapaklar obýekte girip bilmez. Mutex döretmek üçin hiç zat etmegiň zerurlygy ýok: ol eýýäm synpda guruldy Object, ýagny Java-daky her bir obýektiň bardygyny aňladýar.

Sinhronlaşdyrylan operatoryň Java-da nähili işleýändigi

Sinhronlaşdyrylan täze açar söz bilen tanyşalyň . Kodumyzyň belli bir bölegini belleýär. Kodlar toplumy sinhronlaşdyrylan açar söz bilen bellenen bolsa, bu blok bir gezekde diňe bir sapak bilen ýerine ýetirilip bilner. Sinhronizasiýa dürli usullar arkaly amala aşyrylyp bilner. Mysal üçin, tutuş sinhronlaşdyrylan usuly dörediň:
public synchronized void doSomething() {

   //...method logic
}
Ora-da käbir obýektde sinhronizasiýa amala aşyrylýan bir topar kod ýazyň:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...some logic available to all threads

       synchronized (obj) {

           //logic that is only available to one thread at a time
       }
   }
}
Manysy ýönekeý. Bir sapak sinhronlaşdyrylan söz bilen bellenen kod toparyna girse, derrew obýektiň muteeksine eýe bolýar we şol bir blok ýa-da usula girmäge synanyşýan beýleki sapaklar, öňki sapak işini gutarýança garaşmaga mejbur bolýar monitor. Tekstiň sinhronizasiýasy.  Sinhronlaşdyrylan operator - 3Theogsa-da! Kurs leksiýalarynda sinhronlaşdyrylan mysallary eýýäm gördüňiz, ýöne olar başgaça görünýärdi:
public void swap()
{
   synchronized (this)
   {
       //...method logic
   }
}
Mowzuk siziň üçin täze, elbetde sintaksis bilen bulaşyklyk bolar. Şonuň üçin ýazuw usullarynda soň bulaşmazlyk üçin derrew ýadyňyzdan çykarmaň. Bu iki ýazuw usuly bir zady aňladýar:
public void swap() {

   synchronized (this)
   {
       //...method logic
   }
}


public synchronized void swap() {

   }
}
Birinji ýagdaýda, usula gireniňizden soň sinhron kod koduny döredýärsiňiz. thisObýekt , ýagny häzirki obýekt bilen sinhronlanýar . Ikinji mysalda bolsa sinhron sözüni tutuş usula goýduň. Indi sinhronizasiýa amala aşyrylýan obýekti aç-açan görkezmegiň zerurlygy ýok. Tutuş usul bir söz bilen bellenenden soň, bu usul synpyň ähli obýektleri üçin awtomatiki sinhronlanar. Haýsy usulyň has gowudygyny ara alyp maslahatlaşalyň. Häzirlikçe, iň gowy görýän zadyňyzy saýlaň :) Esasy zat ýatda saklamaly: sinhronlaşdyrylan usuly diňe içindäki ähli logika bir wagtyň özünde bir sapak bilen ýerine ýetirilende yglan edip bilersiňiz. Mysal üçin, bu ýagdaýda doSomething()usuly sinhronlamak ýalňyşlyk bolar:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...some logic available to all threads

       synchronized (obj) {

           //logic that is only available to one thread at a time
       }
   }
}
Görşüňiz ýaly, usulyň bir böleginde sinhronizasiýa zerur däl logika bar. Ondaky kod bir wagtyň özünde birnäçe sapak bilen ýerine ýetirilip bilner we ähli möhüm ýerler aýratyn sinhron blokda bölünip berilýär. Bir pursat. At alyşmak bilen leksiýadan mysalymyzda mikroskopyň aşagyna seredeliň:
public void swap()
{
   synchronized (this)
   {
       //...method logic
   }
}
Üns beriň: sinhronizasiýa ulanylýar this. .Agny, belli bir obýekt üçin MyClass. Bizde 2 sapak ( Thread-1we Thread-2) we diňe bir obýekt bar diýip göz öňüne getiriň MyClass myClass. Bu ýagdaýda, Thread-1usul diýilse myClass.swap(), obýektiň mutexi meşgul bolar we Thread-2oňa jaň etjek bolanyňyzda, myClass.swap()muteeksiň erkin bolmagyna garaşar. MyClassDürli obýektlerde 2 sapak we myClass12 obýekt bar bolsa myClass2, sapaklarymyz bir wagtyň özünde sinhron usullary aňsatlyk bilen ýerine ýetirip biler. Birinji sapak:
myClass1.swap();
Ikinjisi:
myClass2.swap();
Bu ýagdaýda usulyň içindäki sinhronlaşdyrylan açar söz swap()programmanyň işine täsir etmez, sebäbi sinhronizasiýa belli bir obýektde amala aşyrylýar. Ikinji ýagdaýda bizde 2 zat bar, şonuň üçin sapaklar biri-birine kynçylyk döretmeýär. Galyberse-de, iki obýektde 2 dürli muteeks bar we olaryň tutulmagy biri-birine bagly däl.

Statik usullarda sinhronlaşmagyň aýratynlyklary

Aöne statiki usuly sinhronlamak zerur bolsa näme etmeli?
class MyClass {
   private static String name1 = "Olya";
   private static String name2 = "Lena";

   public static synchronized void swap() {
       String s = name1;
       name1 = name2;
       name2 = s;
   }

}
Bu ýagdaýda mutex hökmünde näme hyzmat etjekdigi belli däl. Galyberse-de, her bir obýektiň muteeksiniň bardygyny eýýäm kesgitledik. Problemöne mesele, statiki usul diýmek üçin MyClass.swap()obýektler gerek däl: usul statik! Onda näme bolar? : / Aslynda bu ýerde hiç hili mesele ýok. Java döredijileri hemme zat barada alada etdiler :) Kritiki “köp okalýan” logikany öz içine alýan usul statik bolsa, sinhronizasiýa synp tarapyndan amala aşyrylar. Has düşnükli bolmak üçin ýokardaky kody täzeden ýazyp bolar:
class MyClass {
   private static String name1 = "Olya";
   private static String name2 = "Lena";

   public static void swap() {

       synchronized (MyClass.class) {
           String s = name1;
           name1 = name2;
           name2 = s;
       }
   }

}
Aslynda, bu barada özbaşdak pikir edip bilersiňiz: obýektler bolmansoň, sinhronizasiýa mehanizmi haýsydyr bir usul bilen synplara “gaty” bolmaly. Ine, şeýle: sapaklaryň arasynda sinhronlap bilersiňiz.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION