Pendahuluan Penggunaan Semafor Sinkronisasi Dengan Semafor

005 public static void mainString args[]throws Exception 006 { 007 Gambreng gamserver=new GambrengJUMLAH_PEMAIN; 008 Thread[] pemain=new Thread[JUMLAH_PEMAIN]; 009 for int ii=0; iiJUMLAH_PEMAIN; ii++ 010 { 011 pemain[ii]= new Thread new Pemaingamserver, ii; 012 pemain[ii].start; 013 014 } 015 gamserver.bandarGambreng; 017 } 018 019 } 020 Pada class Hompimpah, dibuat objek baru dari class Gambreng baris 7, dimana dalam kelas tersebut dibuat 2 jenis thread yaitu thread bandar dan thread pemain. Masing-masing thread adalah array dari objek Semafor, yang berkapasitas JUMLAH_PEMAIN, yaitu 6. Kemudian kedua jenis thread di set value-nya sebagai 0 terdapat pada class Gambreng. Hal ini mengindikasikan bahwa thread bandar dan pemain sedang tidur. Dalam kelas Gambreng, mutex sebagai objek dari class Semafor, di set 1,yang berarti bahwa critical section sedang dalam keadaan available atau tidak ada thread yang sedang memakai. Kemudian iterasiGambreng di set 0 dan pemanggilan method resetGambreng pada class Gambreng sebagai penanda awal permainan Pada baris ke 8 class Hompimpah dibuat array object baru dari class Thread yaitu pemain sebanyak JUMLAH_PEMAIN yang di set 6. Tiap-tiap thread memiliki no_pemain dan memiliki objek dari class Gambreng. Selanjutnya thread- thread tersebut menjalankan method run -nya, dimana dalam method tersebut tiap-tiap thread pemain mengirimkan nomornya untuk diakses dalam method pemainGambrengint yang berada pada class Gambreng. Contoh 27.3. method pemainGambreng 078 public void pemainGambreng int nomor 079 { 080 syncBandarPemainnomor; 081 whilemenangGambreng 082 { 083 mutex.kunci; 084 085 ifintMath.random2==1 086 { 087 truePemain=nomor; 088 trueCount++; 089 090 } 091 else 092 { 093 falsePemain=nomor; 094 falseCount++; 095 } 096 mutex.buka; 097 syncBandarPemainnomor; 098 } 099 } 100 public void resetGambreng 101 { 102 mutex.kunci; 103 adaPemenang=false; 104 truePemain=0; 105 trueCount=0; 106 falsePemain=0; 107 falseCount=0; 200 108 109 mutex.buka; 110 } 111 Pada fungsi tersebut tiap-tiap thread akan mengakses critical section secara bergantian, sesuai dengan prinsip mutual exclusion . Di dalam critical section , thread-thread akan dicek apakah truePemaintelapak atau falsePemainpunggung kemudian dihitung berapa jumlah telapak dan punggungnya. Proses ini akan terus me-loop sampai ada pemenang. Sebelum memasuki critical section dan melakukan pengecekan, sistem melakukan proses sinkronisasi bandar dan pemain, dengan memangil fungsi syncBandarPemain Contoh 27.4. syncBandarPemain 155 private void syncBandarPemainint ii 156 { 157 bandar[ii].buka; 158 pemain[ii].kunci; 159 } 160 dalam fungsi tersebut bandar melepaskan kunci, dan memanggil thread pemain dengan notify yang merupakan bagian dari fungsi buka dari class Semafor, untuk kemudian thread tersebut dapat mengakses critical section. Setelah seluruh thread pemain mengakses critical section dan melakukan pengecekan, program memanggil fungsi bandarGambreng pada class Gambreng,untuk melakukan proses sinkronisasi bandar yaitu memanggil fungsi syncBandar Contoh 27.5. syncBandar 141 private void syncBandar 142 { 143 forint ii=0;iijumlahPemain;ii++ 144 { 145 bandar[ii].kunci; 146 } 147 } , sehingga bandar terkunci dalam critical section dan memegang kekuasaan dalam Gambreng untuk melakukan perulangan fungsi-fungsi berikut, yang masing-masing akan dipanggil dalam fungsi bandarGambreng : 1. Me-reset permainan gambreng dengan memanggil fungsi resetGambreng . Contoh 27.6. resetGambreng 100 public void resetGambreng 101 { 102 mutex.kunci; 103 adaPemenang=false; 104 truePemain=0; 105 trueCount=0; 106 falsePemain=0; 107 falseCount=0; 201