JavaRush /Java Blog /Random-TK /Muteksiň, monitoryň we semaforyň arasynda näme tapawut ba...

Muteksiň, monitoryň we semaforyň arasynda näme tapawut bar?

Toparda çap edildi
Salam! JavaRush-da köp okalmagy öwrenýän wagtyňyz köplenç “mutex” we “monitor” düşünjelerine duş geldiňiz. Indi olaryň tapawudyna göz aýlamazdan jogap berip bilersiňizmi? :) Mutex, monitor we semafor arasynda näme tapawut bar - 1Başarsaňyz, gowy! Bolmasa (we köplenç şeýle bolýar) - geň däl. "Mutex" we "monitor" düşünjeleri hakykatdanam baglanyşykly. Mundan başga-da, leksiýalary okaýarkaňyz we internetdäki daşarky çeşmelerde köp okalýan wideolara tomaşa edeniňizde, başga bir meňzeş düşünje - “semafor” bilen tanyşarsyňyz. Onuň işleýşi, esasan, monitora we mutexe meňzeýär. Şonuň üçin geliň, bu üç adalga düşüneliň, birnäçe mysallara seredeliň we ahyrynda biri-birinden nähili tapawutlanýandyklaryna düşünmek üçin kellämizde tertipleşdiriň :)

Mutex

Mutex sapaklary sinhronlamak üçin ýörite obýektdir. Java-daky her bir obýekte “birikdirildi” - muny eýýäm bilýärsiňiz :) Adaty synplary ulanmagyňyz ýa-da öz synplaryňyzy döretmegiňiz möhüm däl, aýdyň Catwe Dog: ähli synplaryň obýektleriniň muteeks bar . “Mutex” ady iňlis dilinde “MUTual Exclusion” - “özara aýrylmak” sözlerinden gelip çykýar we bu onuň maksadyny ajaýyp görkezýär. Öňki leksiýalaryň birinde aýdyşymyz ýaly, muteeksiň wezipesi, belli bir wagtda diňe bir sapagyň bir obýekte girip bilmegi üçin şeýle mehanizmi üpjün etmekdir . Muteks üçin hakyky durmuşda meňzeşlik “hajathana mysaly”. Bir adam hajathana girende, gapyny içinden gulplaýar. Hajathana birnäçe sapakdan girip boljak obýekt hökmünde hereket edýär. Hajathana gapysynyň gulpy muteeksiň, daşardaky adamlaryň nobaty bolsa sapaklaryň roludyr. Gapynyň gulpy hajathana muteeksidir: bir gezekde diňe bir adamyň içerde bolmagyny üpjün edýär. Muteksiň, monitoryň we semaforyň arasynda näme tapawut bar - 2Başgaça aýdylanda, umumy çeşmelerde bir gezekde diňe bir sapak işläp biler. Beýleki sapaklaryň (adamlaryň) basyp alnan çeşmelere girmek synanyşyklary şowsuz bolar. Muteksiň birnäçe möhüm aýratynlygy bar. Birinjiden , diňe iki ştat mümkin - “erkin” we “işli”. Munuň işleýşine düşünmegi aňsatlaşdyrýar: Boolean üýtgeýjileriniň hakyky / ýalan ýa-da ikilik san ulgamy 1/0 bilen meňzeşlikleri çekip bolýar. Ikinjiden , ştatlara göni gözegçilik edip bolmaz. Java-da obýekti aç-açan almaga, muteeksini almaga we oňa islenýän statusy bermäge mümkinçilik berýän mehanizm ýok. Başgaça aýdylanda, aşakdaky ýaly bir zat edip bilmersiňiz:
Object myObject = new Object();
Mutex mutex = myObject.getMutex();
mutex.free();
Şeýlelik bilen, obýektiň muteeksini çykaryp bolmaz. Oňa diňe Java enjamy girip biler. Programmistler dil gurallaryny ulanyp muteeksler bilen işleýärler.

Monitor

Monitor, muteeks üçin goşmaça “goşmaça”. Aslynda, monitor programmist üçin “görünmeýän” kod bölegi . Mutex hakda öňem aýdyp, ýönekeý bir mysal berdik:
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
       }
   }
}
Söz bilen bellenen kod blokynda synchronized, obýektimiziň muteeks tutulýar obj. Bolýar, tutmak bolýar, ýöne “goranyş mehanizmi” nädip gazanylýar? Näme üçin beýleki sapaklar bir söz görenlerinde synchronizedblokyň içine girip bilmeýärler ? Gorag mehanizmini döredýän monitor! Düzüji sözi synchronizedbirnäçe ýörite kod böleklerine öwürýär. Ushene bir gezek usul bilen mysalymyza gaýdyp geleliň doSomething()we oňa goşalyň:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...some logic available to all threads

       //logic that is only available to one thread at a time
       synchronized (obj) {

           /*выполнить важную работу, при которой доступ к an objectу
           должен быть только у одного потока*/
           obj.someImportantMethod();
       }
   }
}
Ine, düzüjiniň bu kody öwrenden soň programmamyzyň "kapotynyň aşagynda" näme bolar:
public class Main {

   private Object obj = new Object();

   public void doSomething() throws InterruptedException {

       //...some logic available to all threads

       //логика, которая одновременно доступна только для одного потока:

       /*до тех пор, пока мьютекс an object занят -
       любой другой поток (кроме того, который его захватил), спит*/
       while (obj.getMutex().isBusy()) {
           Thread.sleep(1);
       }

       //пометить мьютекс an object How занятый
       obj.getMutex().isBusy() = true;

       /*выполнить важную работу, при которой доступ к an objectу
       должен быть только у одного потока*/
       obj.someImportantMethod();

       //освободить мьютекс an object
       obj.getMutex().isBusy() = false;
   }
}
Mysal, elbetde, hakyky däl. Bu ýerde, Java ýaly kod ulanyp, şu wagt Java maşynynyň içinde bolup geçýän zatlary görkezmäge synanyşdyk. Şeýle-de bolsa, bu ýasama kod blokdaky obýekt we sapaklar bilen hakykatda nämeleriň bolup geçýändigi synchronizedwe düzüjiniň bu sözi programmist üçin “görünmeýän” birnäçe buýruga öwürmegi barada uly düşünje berýär. Aslynda, Java-da monitor söz ulanyp aňladylýarsynchronized . Iň soňky mysaldaky sözüň ýerine peýda bolan ähli kod synchronizedmonitordyr.

Semaphore

Köp okalmagy özbaşdak öwreneniňizde duş gelýän başga bir söz “semafor”. Munuň nämedigini we monitordan we muteeksden nähili tapawutlanýandygyny anyklalyň. Semafor, çeşmä girişi sinhronlamak üçin serişdedir. Onuň aýratynlygy, sinhronizasiýa mehanizmini döredeninde hasaplaýjyny ulanmagydyr. Hasaplaýjy, bir wagtyň özünde umumy çeşmä näçe sapagyň girip biljekdigini aýdýar. Muteksiň, monitoryň we semaforyň arasynda näme tapawut bar - 3Java-daky semaforlar synp tarapyndan görkezilýär Semaphore. Semaphore obýektleri döredenimizde, aşakdaky konstruktorlary ulanyp bileris:
Semaphore(int permits)
Semaphore(int permits, boolean fair)
Gurluşykçynyň ýanyna geçýäris:
  • int permits- başlangyç we iň ýokary hasap bahasy. .Agny, bir wagtyň özünde näçe sapak umumy çeşmä girip biler;

  • boolean fair- sapaklaryň giriş tertibini kesgitlemek. Eger fair= dogry bolsa , garaşýan sapaklara haýyş eden tertibi boýunça ygtyýar berilýär. Falsealňyş bolsa , sargyt sapak meýilleşdirijisi tarapyndan kesgitlener.

Semaforlary ulanmagyň nusgawy mysaly, günortanlyk filosoflar meselesidir .
Muteksiň, monitoryň we semaforyň arasynda näme tapawut bar - 4
Has gowy düşünmek üçin şertlerini birneme ýönekeýleşdireris. Nahar gerek 5 filosofymyz bar diýip göz öňüne getiriň. Şol bir wagtyň özünde, biziň bir stolumyz bar, şol bir wagtyň özünde iki adamdan köp bolup bilmez. Biziň wezipämiz ähli filosoflary iýmitlendirmek. Olaryň ikisi-de aç bolmaly däldir, ýa-da stoluň başynda oturjak bolanda biri-birini "petiklemeli däldir" (petiklenmeli däldiris). Filosof synpymyz şeýle bolar:
class Philosopher extends Thread {

   private Semaphore sem;

   // поел ли философ
   private boolean full = false;

   private String name;

   Philosopher(Semaphore sem, String name) {
       this.sem=sem;
       this.name=name;
   }

   public void run()
   {
       try
       {
           // если философ еще не ел
           if (!full) {
               //Запрашиваем у семафора разрешение на выполнение
               sem.acquire();
               System.out.println (name + " садится за стол");

               // философ ест
               sleep(300);
               full = true;

               System.out.println (name + " поел! Он выходит из-за стола");
               sem.release();

               // философ ушел, освободив место другим
               sleep(300);
           }
       }
       catch(InterruptedException e) {
           System.out.println ("What-то пошло не так!");
       }
   }
}
Ine, programmamyzy işletmek üçin kod:
public class Main {

   public static void main(String[] args) {

       Semaphore sem = new Semaphore(2);
       new Philosopher(sem,"Сократ").start();
       new Philosopher(sem,"Платон").start();
       new Philosopher(sem,"Аристотель").start();
       new Philosopher(sem,"Фалес").start();
       new Philosopher(sem,"Пифагор").start();
   }
}
Bir wagtyň özünde diňe iki filosofyň iýip bilýän şertini kanagatlandyrmak üçin 2 sany sanap ýarym ýasadyk. Onlyagny, bir wagtyň özünde diňe iki sapak işläp biler, sebäbi synpymyz Philosophermiras galypdy Thread! Synpyň usullary acquire()we usullary onuň rugsady hasaplaýjysyna gözegçilik edýär. Usul, ýarym çeşmeden bir çeşmä girmäge rugsat soraýar. Hasap> 0 bolsa, rugsat berilýär we hasaplaýjy 1 bilen azalýar. Usul ozal berlen rugsady "boşadýar" we ony hasaplaýja gaýtaryp berýär (semaforyň grant hasaplaýjysyny 1-e köpeldýär). Programmany işledenimizde näme alarys? Mesele çözüldimi? Filosoflarymyz nobatlaryna garaşyp söweşerlermi? :) Bu alnan konsol çykyşymyz: Sokrat stoluň başynda otyr Platon Sokratyň iýen stolunda otyr ! Stoldan çykýar. Platon iýdi! Stoldan çykýar Aristotel stoluň başynda oturýar Pifagor Aristoteliň iýen stolunda otyr! Pifagoryň iýen stolundan çykýar! Stoldan çykýar Thales iýen stolunda otyr ! Stoldan çykýar, biz üstünlik gazandyk! Tales ýeke özi naharlanmaly bolsa-da, meniň pikirimçe, ol bize däli däl :) Mutex bilen semaforyň arasynda käbir meňzeşlikleri gören bolmagyňyz mümkin. Umuman, olaryň birmeňzeş maksady bar: käbir çeşmelere girişi sinhronlamak. Onlyeke-täk tapawut, obýektiň muteeksini diňe bir sapak bilen gazanyp bolýar, semafor bolsa, sapak hasaplaýjy ulanylýar we olaryň köpüsi birbada çeşmä girip bilýär. Bu diňe bir tötänleýin meňzeşlik däl :) Aslynda, mutex bir ýerde ýerleşýän semafordyr . Counteragny, başda hasaplaýjy 1-e düzülen ýarym deňizdir. Oňa "ikilik semafor" hem diýilýär, sebäbi hasaplaýjynyň diňe 2 bahasy bolup biler - 1 ("mugt") we 0 ("işli"). Bu hemmesi! Görşüňiz ýaly, hemme zat beýle bulaşyk däldi :) Indi, köp okamak mowzugyny internetde has jikme-jik öwrenmek isleseňiz, düşünjelere geçmek biraz aňsat bolar. Indiki sapaklarda görüşeris! release()Semaphoreacquire()release()Muteksiň, monitoryň we semaforyň arasynda näme tapawut bar - 5
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION