Penjelasan Program

Pada program readers/writers diatas, ada 5 class:

ReaderWriterServer (baris 5-25). Kelas ini merupakan kelas yang memuat method main(). Kelas ini membuat 5 objek, 3 objek reader dan 2 objek writer serta menjalankan semua objek-objek tadi.

Reader(baris 31-57). Kelas ini berfungsi sebagai thread yang membaca data. Kelas ini sebelum mulai membaca akan mencetak "reader ... wants to read." terlebih dahulu kemudian memanggil method startRead() untuk mulai membaca, jika tidak ditahan pada salah satu semaphore (di kelas Database) akan ada output "reader ... is reading..."; kemudian setelah waktu yang acak (oleh Database.napping()) akan tercetak "reader ... is done reading..." dan memanggil method endRead() pada kelas Database untuk berhenti membaca.

Writer(baris 63-90). Kelas ini berfungsi sebagai thread yang menulis data. Kelas ini sebelum mulai akan tidur terlebih dahulu, lalu akan mencetak "writer ... wants to write." terlebih dahulu kemudian memanggil method startWrite() untuk mulai menulis, jika tidak ditahan pada semaphore db (di kelas Database) akan ada output "writer ... is writing..."; kemudian setelah waktu yang acak (oleh Database.napping()) akan tercetak "writer ... is done writing." dan memanggil method endWrite() pada kelas Database untuk berhenti menulis.

Semaphore(baris 96-121). Seperti yang sudah dijelaskan pada bagian sebelumnya, pada program ini, Semaphore digunakan untuk sinkronisasi antar readers atau antar writers atau antar readers dengan readers. Method yang ada pada kelas ini adalah method P() yang akan mencoba mengurangi nilai variabel value, variabel tersebut akan bisa dikurangi jika variabel tersebut bernilai lebih dari nol. Jika variabel value sama dengan atau kurang dari nol maka thread yang memanggil method ini akan memanggil method wait() yang membuatnya menunggu. Method ini berfungsi untuk menghalangi thread untuk tidak masuk ke dalam critical section. Method P() memanggil method wait() yang akan menyebabkan thread- thread yang akan memasuki critical section menunggu. Selain itu pada kelas ini terdapat method V() yang di dalamnya menambahkan nilai value sehingga nilainya tidak nol lagi, serta memanggil method notify(). Method notify() akan membangunkan salah satu thread yang sedang menunggu secara acak.

Database(baris 127-176). Kelas ini mengimplementasi semua pekerjaan yang dilaksanakan oleh kelas Writer dan kelas Reader. Kelas Database ini mempunyai 5 method yaitu napping(), startRead(), endRead(), startWrite(), dan endWrite(). Method napping() berfungsi membuat thread yang mengaksesnya akan memanggil method sleep() sehingga thread tersebut 'tertidur'. Waktu tidur tersebut acak dan tidak mutlak, hal ini menyebabkan output dari program akan bervariasi, tapi tetap memenuhi ketentuan. Method kedua adalah startRead(). Method ini me return sebuah int merepresentasikan jumlah reader yang sedang mengakses database pada saat itu. Dia hanya mengijinkan hanya satu reader pada satu waktu yang dapat mengakses readerCount dengan mengunci Semaphore mutex(dengan mutex.P()). Bila jumlah reader == 1 maka reader tersebut akan menutup Semaphore db (dengan db.P()) sehingga writer tidak diijinkan masuk untuk mengakses data. Method selanjutnya adalah endRead(). Method ini diakses oleh reader yang telah selesai mengakses data. Untuk mengurangi readerCount maka reader tersebut harus mengakses Semaphore mutex kembali. Jika nilai readerCount== 0, yang berarti sudah tidak ada lagi reader yang sedang mengakses data, maka reader memanggil method V() untuk membuka Semaphore db, sehingga writer yang sedang mengantri dapat masuk untuk mengakses data. Method selanjutnya adalah startWrite(). Method ini hanya memanggil satu method yaitu mengunci Semaphore db(dengan db.P()). Hal ini dimaksudkan bila ada writer yang sedang mengakses data, maka tidak ada writer lain atau reader yang diperbolehkan masuk untuk mengakses data. Method endWrite() dipanggil oleh kelas writer yang telah selesai mengakses database. Method ini memanggil method V() untuk membuka Semaphore db sehingga reader atau writer lain dapat masuk untuk mengakses data.