Mutex & Semaphore

Sejarah

We Will Write a Custom Essay Specifically
For You For Only $13.90/page!


order now

1.   
Mutex

          Persyaratan mutual exclusion (mutex) pertama kali diidentifikasi dan
dipecahkan oleh Edsger W. Dijkstra dalam makalahnya yang berjudul “Solution of a problem in
concurrent programming control (1965)”, yang
dikreditkan sebagai topik pertama dalam studi algoritma konkuren (concurrent algorithms).

2.   
Semaphore

          Konsep semaphore diciptakan oleh ilmuwan komputer belanda Edsger W. Dijkstra
pada tahun 1962 atau 1963, dan telah banyak digunakan di berbagai sistem
operasi. Ini juga telah digunakan sebagai mekanisme kontrol untuk pengendali I/O.

 

Metode

3.   
Algoritma Dekker

          Algoritma Dekker adalah
algoritma yang pertama diketahui yang memecahkan masalah mutex dalam pemrograman konkuren. Hal ini dikreditkan kepada Th.
J. Dekker, seorang matematikawan belanda. Algoritma Dekker digunakan dalam
proses antrian, dan memungkinkan dua thread berbeda untuk berbagi single-use resource tanpa konflik dengan
menggunakan shared memory untuk
komunikasi.

4.   
Algoritma Peterson

          Algoritma Peterson adalah algoritma pemrograman
konkuren yang dikembangkan oleh Gary L. Peterson pada tahun 1981. Dikenal sebagai algoritma sederhana bila
dibandingkan dengan algoritma  yang lain. Algoritma Peterson digunakan untuk mutex dan memungkinkan
dua proses untuk berbagi single-use
resource tanpa konflik. Hanya menggunakan shared memory untuk komunikasi. Formula Peterson awalnya hanya
bekerja dengan dua proses, namun sekarang telah digeneralisasikan lebih dari dua.

 

Implementasi

Mutex

package rarinugraha;
 
import java.util.concurrent.Semaphore;
 
/**
 *
 * @author Rarinugraha
 */
public class MutexEx {
 
    static Semaphore semaphore =
new Semaphore(1);
 
    static class EToll extends
Thread {
 
        String gto =
“”;
 
        EToll(String gto) {
            this.gto = gto;
        }
 
        public void run() {
 
            try {
 
               
System.out.println(gto + ” : Nyari GTO (-_-)”);
               
System.out.println(gto + ” : GTO yang tersedia : ”
                        +
semaphore.availablePermits());
 
               
semaphore.acquire();
               
System.out.println(gto + ” : Masuk GTO (* ^ ? ^)”);
 
                try {
 
                    System.out.println(gto +
” : Lagi tapping,”
                            +
” GTO yang tersedia : ”
                            +
semaphore.availablePermits());
 
                   
Thread.sleep(1000);
 
                } finally {
 
                    System.out.println(gto + ” :
Selesai tapping…”);
                   
semaphore.release();
                   
System.out.println(gto + ” : GTO yang tersedia : ”
                            +
semaphore.availablePermits());
 
                }
 
            } catch
(InterruptedException e) {
 
               
e.printStackTrace();
 
            }
 
        }
 
    }
 
    public static void
main(String args) {
 
       
System.out.println(“Total GTO tersedia : ”
                +
semaphore.availablePermits());
 
        EToll et1 = new
EToll(“Alpha”);
        et1.start();
 
        EToll et2 = new
EToll(“Beta”);
        et2.start();
 
        EToll et3 = new
EToll(“Gamma”);
        et3.start();
 
        EToll et4 = new
EToll(“Delta”);
        et4.start();
 
    }
}

run:
Total GTO tersedia : 1
Alpha : Nyari GTO (-_-)
Beta : Nyari GTO (-_-)
Gamma : Nyari GTO (-_-)
Beta : GTO yang tersedia : 1
Gamma : GTO yang tersedia : 1
Alpha : GTO yang tersedia : 1
Beta : Masuk GTO (* ^ ? ^)
Beta : Lagi tapping, GTO yang tersedia : 0
Delta : Nyari GTO (-_-)
Delta : GTO yang tersedia : 0
Beta : Selesai tapping…
Beta : GTO yang tersedia : 1
Gamma : Masuk GTO (* ^ ? ^)
Gamma : Lagi tapping, GTO yang tersedia : 0
Gamma : Selesai tapping…
Gamma : GTO yang tersedia : 1
Alpha : Masuk GTO (* ^ ? ^)
Alpha : Lagi tapping, GTO yang tersedia : 0
Alpha : Selesai tapping…
Delta : Masuk GTO (* ^ ? ^)
Delta : Lagi tapping, GTO yang tersedia : 0
Alpha : GTO yang tersedia : 0
Delta : Selesai tapping…
Delta : GTO yang tersedia : 1
BUILD SUCCESSFUL (total time: 4 seconds)

Semaphore

package rarinugraha;
 
import java.util.concurrent.Semaphore;
 
/**
 *
 * @author Rarinugraha
 */
public class SemaphoreEx {
 
    static Semaphore semaphore =
new Semaphore(2);
 
    static class TempatWudhu
extends Thread {
 
        String keran =
“”;
 
        TempatWudhu(String keran)
{
            this.keran = keran;
        }
 
        public void run() {
 
            try {
 
               
System.out.println(keran + ” : Nyari keran (-_-)”);
               
System.out.println(keran + ” : Keran yang tersedia : ”
                        +
semaphore.availablePermits());
 
               
semaphore.acquire();
               
System.out.println(keran + ” : Dapat keran (* ^ ? ^)”);
 
                try {
 
                   
System.out.println(keran + ” : Lagi wudhu,”
                            +
” keran yang tersedia : ”
                            +
semaphore.availablePermits());
 
                   
Thread.sleep(1000);
 
                } finally {
 
                   
System.out.println(keran + ” : Selesai wudhu…”);
                   
semaphore.release();
                   
System.out.println(keran + ” : Keran yang tersedia : ”
                            +
semaphore.availablePermits());
 
                }
 
            } catch
(InterruptedException e) {
 
               
e.printStackTrace();
 
            }
 
        }
 
    }
 
    public static void
main(String args) {
 
       
System.out.println(“Total keran tersedia : ”
                +
semaphore.availablePermits());
 
        TempatWudhu tw1 = new
TempatWudhu(“Alpha”);
        tw1.start();
 
        TempatWudhu tw2 = new
TempatWudhu(“Beta”);
        tw2.start();
 
        TempatWudhu tw3 = new
TempatWudhu(“Gamma”);
        tw3.start();
 
        TempatWudhu tw4 = new
TempatWudhu(“Delta”);
        tw4.start();
 
    }
}

run:
Total
keran tersedia : 2
Alpha :
Nyari keran (-_-)
Beta :
Nyari keran (-_-)
Beta :
Keran yang tersedia : 2
Alpha :
Keran yang tersedia : 2
Beta : Dapat
keran (* ^ ? ^)
Alpha :
Dapat keran (* ^ ? ^)
Alpha :
Lagi wudhu, keran yang tersedia : 0
Beta :
Lagi wudhu, keran yang tersedia : 0
Delta :
Nyari keran (-_-)
Delta :
Keran yang tersedia : 0
Gamma :
Nyari keran (-_-)
Gamma :
Keran yang tersedia : 0
Alpha :
Selesai wudhu…
Beta :
Selesai wudhu…
Beta :
Keran yang tersedia : 2
Delta :
Dapat keran (* ^ ? ^)
Alpha :
Keran yang tersedia : 1
Delta :
Lagi wudhu, keran yang tersedia : 0
Gamma :
Dapat keran (* ^ ? ^)
Gamma :
Lagi wudhu, keran yang tersedia : 0
Delta :
Selesai wudhu…
Gamma :
Selesai wudhu…
Gamma :
Keran yang tersedia : 1
Delta :
Keran yang tersedia : 2
BUILD
SUCCESSFUL (total time: 2 seconds)

 

 

Kesimpulan

1.      
Mutex: Dalam satu resource, hanya diperbolehkan  1 thread
saja yang mengakses pada saat itu. Thread lainnya harus mengantri sampai thread
sebelumya selesai mengakses.

2.      
Semaphore: Dalam satu resource, diperbolehkan > 1 thread
yang mengakses secara bersamaan.