JavaRush /Блоги Java /Random-TG /Фарқи байни мутекс, монитор ва семафор чӣ гуна аст

Фарқи байни мутекс, монитор ва семафор чӣ гуна аст

Дар гурӯҳ нашр шудааст
Салом! Ҳангоми омӯзиши multithreading дар JavaRush, шумо аксар вақт бо мафҳумҳои “mutex” ва “monitor” дучор меомадед. Метавонед ҳоло, бидуни нигоҳ кардан, ҷавоб диҳед, ки онҳо чӣ гуна фарқ мекунанд? :) Фарқи байни мутекс, монитор ва семафор чӣ гуна аст - 1Агар метавонӣ, офарин! Агар не (ва аксар вақт ин рӯй медиҳад) - тааҷҷубовар нест. Мафҳумҳои «мутекс» ва «монитор» воқеан бо ҳам алоқаманданд. Гузашта аз ин, ҳангоми хондани лексияҳо ва тамошои видеоҳо оид ба мултимедиявӣ дар захираҳои беруна дар Интернет, шумо бо консепсияи дигари шабеҳ - "семафор" дучор мешавед. Функсияи он низ асосан ба монитор ва мутекс монанд аст. Аз ин рӯ, биёед ин се истилоҳро дарк кунем, чанд мисолро бубинем ва дар ниҳоят дар сарамон фаҳми он, ки чӣ гуна онҳо аз ҳамдигар фарқ мекунанд :)

Мутекс

Мутекс an objectи махсус барои ҳамоҳангсозии риштаҳо мебошад. Он ба ҳар як an object дар Java "замима карда шудааст" - шумо аллакай медонед, ки :) Фарқ надорад, ки шумо синфҳои стандартиро истифода мебаред ё синфҳои шахсии худро эҷод мекунед, бигӯед ва Cat: Dogҳама an objectҳои ҳама синфҳо мутекс доранд . Номи "mutex" аз забони англисӣ "MUTual Exclusion" - "exclusion мутақобила" гирифта шудааст ва ин ҳадафи онро комилан инъикос мекунад. Тавре ки мо дар яке аз лексияҳои қаблӣ гуфта будем, вазифаи мутекс аз он иборат аст, ки чунин механизмро таъмин кунад, то дар вақти муайян танҳо як ришта ба an object дастрасӣ дошта бошад . Аналогияи маъмули ҳаёти воқеӣ барои мутекс ин "мисоли ҳоҷатхона" мебошад. Вақте ки шахс ба ҳоҷатхона ворид мешавад, дарро аз дарун қуфл мекунад. Ҳоҷатхона ҳамчун an objectе амал мекунад, ки тавассути риштаҳои сершумор дастрас шудан мумкин аст. Қулфи дари ҳоҷатхона нақши мутекс ва навбати мардум дар берун нақши риштаҳост. Қулфи дар як мутекси ҳоҷатхона аст: он кафолат медиҳад, ки дар як вақт танҳо як нафар метавонад дар дохor хона бошад. Фарқи байни мутекс, монитор ва семафор чӣ гуна аст - 2Ба ибораи дигар, дар як вақт танҳо як ришта метавонад дар захираҳои муштарак кор кунад. Кӯшишҳои дигар риштаҳо (одамон) барои дастрасӣ ба захираҳои ишғолшуда ноком мешаванд. Мутекс дорои якчанд хусусиятҳои муҳим аст. Аввалан , танҳо ду ҳолат имконпазир аст - "озод" ва "банд". Ин фаҳмидани он, ки чӣ тавр кор мекунад, осонтар мекунад: параллелҳоро бо тағирёбандаҳои мантиқии true/false ё системаи рақамии дуӣ 1/0 кашидан мумкин аст. Дуюм , давлатҳоро мустақиман назорат кардан мумкин нест. Дар Java механизмҳое вуҷуд надоранд, ки ба шумо имкон медиҳанд, ки an objectро ба таври возеҳ гирифта, мутекси онро ба даст оред ва ба он мақоми дилхоҳро таъин кунед. Ба ибораи дигар, шумо наметавонед чизе монанди:
Object myObject = new Object();
Mutex mutex = myObject.getMutex();
mutex.free();
Ҳамин тариқ, мутекси an objectро озод кардан мумкин нест. Танҳо мошини Java ба он дастрасии мустақим дорад. Барномасозон бо истифода аз абзорҳои забонӣ бо мутексҳо кор мекунанд.

Монитор

Монитор як “иловагӣ” ба мутекс аст. Дар асл, монитор як пораи codeест, ки барои барномасоз "ноаён" аст . Пештар дар бораи mutex сухан ронда, мо як мисоли оддӣ додем:
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
       }
   }
}
Дар блоки code, ки бо калима ишора шудааст synchronized, мутекси an objectи мо гирифта мешавад obj. Хуб, забт мешавад, аммо "механизми дифоъ" чӣ гуна ба даст омадааст? Чаро риштаҳои дигар ҳангоми дидани калима synchronizedба дохor блок дохил намешаванд ? Ин мониторест, ки механизми муҳофизатиро эҷод мекунад! Компилятор калимаро synchronizedба якчанд қисмҳои махсуси code табдил медиҳад. Бори дигар ба мисоли худ бо усул бармегардем doSomething()ва ба он илова мекунем:
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();
       }
   }
}
Ин аст он чизе ки "дар зери сарпӯши" барномаи мо пас аз табдил додани компилятор ин code рӯй медиҳад:
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;
   }
}
Мисол, албатта, воқеӣ нест. Дар ин ҷо, бо истифода аз рамзи Java-монанд, мо кӯшиш кардем, ки дар дохor мошини Java чӣ рӯй дода истодааст, инъикос кунем. Аммо, ин псевдоcode дарки хуб медиҳад, ки воқеан бо an object ва риштаҳо дар дохor блок чӣ рӯй дода истодааст synchronizedва чӣ гуна компилятор ин калимаро ба якчанд фармонҳое табдил медиҳад, ки барои барномасоз "ноаён" мебошанд. Аслан, монитор дар Java бо калимаиsynchronized . Ҳама codeҳое, ки ба ҷои калимаи synchronizedмисоли охирин пайдо шудаанд, монитор мебошанд.

Семафор

Калимаи дигаре, ки шумо ҳангоми омӯзиши мустақилонаи мултимедиявӣ дучор мешавед "семафор" аст. Биёед бифаҳмем, ки он чӣ гуна аст ва он аз монитор ва мутекс чӣ фарқият дорад. Семафор воситаи ҳамоҳангсозии дастрасӣ ба манбаъ мебошад. Хусусияти он дар он аст, ки вай ҳангоми сохтани механизми синхронизатсия ҳисобкунакро истифода мебарад. Ҳисобкунак ба мо мегӯяд, ки чанд ришта дар як вақт метавонанд ба манбаи муштарак дастрасӣ пайдо кунанд. Фарқи байни мутекс, монитор ва семафор чист - 3Семафорҳо дар Java аз ҷониби синф муаррифӣ карда мешаванд Semaphore. Ҳангоми сохтани an objectҳои семафорӣ, мо метавонем конструкторҳои зеринро истифода барем:
Semaphore(int permits)
Semaphore(int permits, boolean fair)
Мо ба конструктор мегузарем:
  • int permits— арзиши ибтидоӣ ва максималии ҳисобкунак. Яъне, чӣ қадар риштаҳо метавонанд ҳамзамон ба манбаи муштарак дастрасӣ пайдо кунанд;

  • boolean fair- муқаррар кардани тартибе, ки риштаҳо дастрасӣ пайдо мекунанд. Агар fair= true бошад , дастрасӣ ба риштаҳои интизорӣ бо тартиби дархосткардаи онҳо дода мешавад. Агар он бардурӯғ бошад , фармоиш аз ҷониби нақшакаши ришта муайян карда мешавад.

Намунаи классикии истифодаи семафорҳо мушкилоти ланч fileсуфҳо мебошад .
Фарқи байни мутекс, монитор ва семафор чӣ гуна аст - 4
Мо барои беҳтар фаҳмидани шартҳои онро каме содда мекунем. Тасаввур кунед, ки мо 5 fileсуф дорем, ки ба хӯроки нисфирӯзӣ ниёз доранд. Дар баробари ин мо як миз дорем ва дар як вакт на бештар аз ду кас дар сари он нишастан мумкин нест. Вазифаи мо аз он иборат аст, ки тамоми fileсуфонро сер кунем. Ҳеҷ кадоме аз онҳо гурусна нашаванд ва ҳангоми кӯшиши нишастан ба сари миз набояд якдигарро «банд» кунанд (мо бояд аз бунбаст канорагирӣ кунем). Ин аст синфи fileсуфи мо чунин хоҳад буд:
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-то пошло не так!");
       }
   }
}
Ва ин аст рамзи иҷро кардани барномаи мо:
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();
   }
}
Мо семафореро бо шумори 2 офаридаем, то шартеро, ки танҳо ду fileсуф дар як вақт хӯрда метавонанд, қонеъ кунем. Яъне танҳо ду ришта дар як вақт кор карда метавонад, зеро синфи мо Philosopherаз Thread! Синф acquire()ва усулҳо ҳисобкунаки иҷозати онро назорат мекунанд. Усул барои дастрасӣ ба манбаъ аз семафор иҷозат талаб мекунад. Агар ҳисобкунак > 0 бошад, иҷозат дода мешавад ва ҳисобкунак то 1 кам карда мешавад. Усул иҷозати қаблан додашударо "озод" мекунад ва онро ба ҳисобкунак бармегардонад (бо афзоиши ҳисобкунаки грантии семафор ба 1). Вақте ки мо барномаро иҷро мекунем, мо чӣ мегирем? Оё масъала хал шудааст, fileсуфони мо мунтазири навбати худ чанг мекунанд? :) Ин баромади консолест, ки мо гирифтем: Суқрот дар сари миз нишаст . Вай аз миз баромад, Афлотун хӯрд! Вай аз миз мебарояд Аристотел дар сари миз нишастааст Пифагор дар сари миз нишастааст Аристотел хӯрдааст! Вай мизро тарк мекунад, ки Пифагор хӯрдааст! Вай мизро тарк мекунад Талес дар сари миз нишастааст Талес хӯрдааст! Вай аз миз мебарояд Мо муваффак шудем! Ва гарчанде ки Фалес маҷбур буд, ки танҳо хӯрок хӯрад, ман фикр мекунам, ки ӯ ба мо девона нест :) Шояд шумо баъзе шабоҳатҳои байни мутекс ва семафорро мушоҳида кардаед. Умуман, онҳо як ҳадаф доранд: ҳамоҳангсозии дастрасӣ ба баъзе манбаъҳо. Ягона тафовут дар он аст, ки мутекси an objectро дар як вақт танҳо як ришта ба даст овардан мумкин аст, дар ҳоле ки дар мавриди семафор ҳисобкунаки ришта истифода мешавад ва чанде аз онҳо метавонанд якбора ба манбаъ дастрасӣ пайдо кунанд. Ва ин танҳо як шабоҳати тасодуфӣ нест :) Дар асл, мутекс семафори якҷоя аст . Яъне ин семафорест, ки ҳисобкунаки он дар аввал ба 1 гузошта шудааст. Онро "семафори дуӣ" низ меноманд, зеро ҳисобкунаки он метавонад танҳо 2 арзиш дошта бошад - 1 ("озод") ва 0 ("банд"). Ҳамааш ҳамин! Тавре ки шумо мебинед, ҳама чиз он қадар печида набуд :) Ҳоло, агар шумо хоҳед, ки мавзӯи бисёрсоҳаро дар Интернет муфассалтар омӯзед, паймоиш дар мафҳумҳо барои шумо каме осонтар мешавад. Дар дарсҳои оянда вохӯрем! release()Semaphoreacquire()release()Фарқи байни мутекс, монитор ва семафор чӣ гуна аст - 5
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION