JavaRush /Blog Jawa /Random-JV /Apa bedane antarane mutex, monitor lan semaphore

Apa bedane antarane mutex, monitor lan semaphore

Diterbitake ing grup
Hello! Nalika sinau multithreading ing JavaRush, sampeyan kerep nemokake konsep "mutex" lan "monitor". Apa sampeyan saiki, tanpa ngintip, njawab kepiye bedane? :) Apa bedane antarane mutex, monitor lan semaphore - 1Yen sampeyan bisa, uga rampung! Yen ora (lan paling asring kedadeyan) - ora ana wonder. Konsep "mutex" lan "monitor" pancen ana hubungane. Kajaba iku, nalika maca ceramah lan nonton video babagan multithreading ing sumber eksternal ing Internet, sampeyan bakal nemokake konsep liyane sing padha - "semaphore". Fungsine uga meh padha karo monitor lan mutex. Mula, ayo ngerti telung istilah kasebut, deleng sawetara conto lan pungkasane atur ing sirah kita ngerti kepiye bedane saben liyane :)

Mutex

Mutex minangka obyek khusus kanggo nyinkronake benang. Iku "ditempelake" kanggo saben obyek ing Jawa - sampeyan wis ngerti :) Ora Matter apa sampeyan nggunakake kelas standar utawa nggawe kelas dhewe, ngomong, Catlan Dog: kabeh obyek saka kabeh kelas duwe mutex a . Jeneng "mutex" asalé saka basa Inggris "MUTUal EXclusion" - "mutual exclusion", lan iki sampurna nggambarake tujuane. Kaya sing wis dakkandhakake ing salah sawijining kuliah sadurunge, tugas mutex yaiku nyedhiyakake mekanisme kasebut supaya mung siji benang sing bisa ngakses obyek ing wektu tartamtu . Analogi populer kanggo mutex ing urip nyata yaiku "conto toilet." Nalika wong mlebu jamban, dheweke ngunci lawang saka njero. Toilet minangka obyek sing bisa diakses kanthi pirang-pirang benang. Kunci ing lawang jamban minangka peran mutex, lan antrian wong ing njaba minangka peran benang. Kunci ing lawang minangka mutex jamban: njamin mung siji wong sing bisa mlebu ing saben wektu. Apa bedane antarane mutex, monitor lan semaphore - 2Ing tembung liyane, mung siji utas ing wektu sing bisa digunakake ing sumber daya sing dienggo bareng. Upaya dening utas liyane (wong) kanggo ngakses sumber daya sing dikuwasani bakal gagal. Mutex nduweni sawetara fitur penting. Kaping pisanan , mung rong negara sing bisa ditindakake - "gratis" lan "sibuk". Iki nggampangake mangertos cara kerjane: paralel bisa digambar nganggo variabel Boolean bener/salah utawa sistem nomer binar 1/0. Kapindho , negara ora bisa dikontrol langsung. Ora ana mekanisme ing Jawa sing ngidini sampeyan njupuk obyek kanthi jelas, entuk mutex lan menehi status sing dikarepake. Ing tembung liyane, sampeyan ora bisa nindakake kaya:
Object myObject = new Object();
Mutex mutex = myObject.getMutex();
mutex.free();
Mangkono, mutex obyek ora bisa dirilis. Mung mesin Java duwe akses langsung menyang. Programer nggarap mutex nggunakake alat basa.

Ngawasi

Monitor minangka "tambahan" tambahan kanggo mutex. Nyatane, monitor minangka potongan kode "ora katon" kanggo programmer . Ngomong babagan mutex sadurunge, kita menehi conto sing gampang:
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
       }
   }
}
Ing blok kode sing ditandhani karo tembung synchronized, mutex obyek kita dijupuk obj. Oke, panangkepan kedadeyan, nanging kepiye carane "mekanisme pertahanan" bisa ditindakake? synchronizedNapa utas liyane ora bisa mlebu ing blok nalika ndeleng tembung ? Iku monitor sing nggawe mekanisme protèktif! Compiler ngowahi tembung kasebut synchronizeddadi sawetara potongan kode khusus. Sawise maneh ayo bali menyang conto kanthi metode doSomething()lan tambahake:
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();
       }
   }
}
Mangkene apa sing bakal kedadeyan "ing tenda" program kita sawise kompiler ngowahi kode iki:
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;
   }
}
Contone, mesthi, ora nyata. Ing kene, nggunakake kode kaya Jawa, kita nyoba nggambarake apa sing kedadeyan ing wektu iki ing mesin Java. Nanging, pseudocode iki menehi pangerten gedhe babagan apa sing kedadeyan karo obyek lan benang ing blok kasebut synchronizedlan carane kompiler ngowahi tembung iki dadi sawetara perintah sing "ora katon" kanggo programer. Ateges, monitor ing Jawa ditulis nganggo tembungsynchronized . Kabeh kode sing katon tinimbang tembung synchronizeding conto pungkasan yaiku monitor.

Semafor

Tembung liyane sing sampeyan temokake nalika sinau multithreading dhewe yaiku "semaphore". Ayo ngerteni apa iku lan kepiye bedane karo monitor lan mutex. Semaphore minangka sarana kanggo nyinkronake akses menyang sumber daya. Keanehane yaiku nggunakake counter nalika nggawe mekanisme sinkronisasi. Counter kasebut ngandhani pirang-pirang utas sing bisa ngakses sumber daya bebarengan. Apa bedane antarane mutex, monitor lan semaphore - 3Semaphore ing basa Jawa diwakili dening kelas Semaphore. Nalika nggawe obyek semaphore, kita bisa nggunakake konstruktor ing ngisor iki:
Semaphore(int permits)
Semaphore(int permits, boolean fair)
We pass menyang konstruktor:
  • int permits- nilai counter dhisikan lan maksimum. Yaiku, pirang-pirang benang sing bisa ngakses sumber daya bebarengan;

  • boolean fair- kanggo netepake urutan kang Utas bakal nampa akses. Yen fair= bener , akses diwenehake menyang thread nunggu miturut urutan sing dijaluk. Yen salah , pesenan bakal ditemtokake dening panjadwal thread.

Conto klasik babagan panggunaan semaphore yaiku masalah filsuf lunching .
Apa bedane antarane mutex, monitor lan semaphore - 4
Kita bakal nyederhanakake istilah kasebut supaya luwih ngerti. Mbayangno kita duwe 5 filsuf sing perlu nedha awan. Ing wektu sing padha, kita duwe siji meja, lan ora luwih saka rong wong bisa ing wektu sing padha. Tugas kita yaiku feed kabeh filsuf. Ora ana sing kudu luwe, utawa kudu "blok" siji liyane nalika nyoba njagong ing meja (kita kudu ngindhari deadlock). Iki kelas filsuf kita bakal katon kaya:
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-то пошло не так!");
       }
   }
}
Lan iki kode kanggo mbukak program kita:
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();
   }
}
Kita nggawe semaphore kanthi jumlah 2 kanggo nyukupi syarat sing mung bisa mangan loro filsuf ing wektu sing padha. Tegese, mung rong utas sing bisa digunakake bebarengan, amarga kelas kita Philosopherdiwarisake saka Thread! Kelas acquire()lan metode ngontrol counter ijin. Cara kasebut njaluk ijin kanggo ngakses sumber daya saka semaphore. Yen counter> 0, ijin diwenehake lan counter dikurangi 1. Cara "ngeculake" ijin sing diwenehake sadurunge lan bali menyang counter (nambah counter hibah semaphore kanthi 1). Apa sing kita entuk nalika mbukak program kasebut? Apa masalah wis rampung? Apa para filsuf kita bakal gelut nalika ngenteni giliran? :) Iki minangka output console sing ditampa: Socrates lenggah ing meja Plato lenggah ing meja sing wis dipangan Socrates! Dheweke ninggalake meja, Plato wis mangan! Dheweke ninggalake meja Aristoteles lenggah ing meja Pythagoras lenggah ing meja sing wis dipangan Aristoteles! Dheweke ninggalake meja sing wis dipangan Pythagoras! Dheweke ninggalake meja Thales lungguh ing meja sing wis dipangan Thales! Dheweke ninggalake meja, kita sukses! Lan sanajan Thales kudu mangan piyambak, Aku ora mad ing kita :) Sampeyan bisa uga wis ngeweruhi sawetara podho antarane mutex lan semaphore a. Umumé, padha duwe tujuan sing padha: kanggo nyinkronake akses menyang sawetara sumber. Bentenipun mung mutex obyek mung bisa dipikolehi dening siji utas ing siji wektu, nalika ing cilik saka semafor, counter thread digunakake, lan sawetara wong bisa ngakses sumber bebarengan. Lan iki ora mung podho kebetulan :) Nyatane, mutex minangka semafor siji-panggonan . Tegese, iku semaphore sing counter wiwitane disetel dadi 1. Iki uga diarani "semaphore biner" amarga counter mung bisa duwe 2 nilai - 1 ("gratis") lan 0 ("sibuk"). Iku kabeh! Kaya sing sampeyan ngerteni, kabeh ora dadi mbingungake :) Saiki, yen sampeyan pengin sinau topik multithreading kanthi luwih rinci ing Internet, bakal luwih gampang sampeyan navigasi konsep kasebut. Ditemokake ing wulangan sabanjure! release()Semaphoreacquire()release()Apa bedane mutex, monitor lan semaphore - 5
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION