Skip navigation


Melanjutkan postingan sebelumnya tentang masalah The Readers and Writers Problem. Untuk memberikan hak ekslusif bagi Writers untuk menulis file maka diperlukan sebuah mekanisme locking. Mekanisme ini akan coba diimplementasikan pada sebuah class bernama Lock.

class Lock {

        public static int countRequestingWriter = 0;
        public static int countRunningWriter = 0;
        public static int countRunningReader = 0;

        public synchronized void lockRead() throws InterruptedException {
            while (countRunningWriter > 0 || countRequestingWriter > 0) {
                wait();
            }
            countRunningReader++;
        }

        public synchronized void unlockRead() {
            countRunningReader--;
            notifyAll();
        }

        public synchronized void lockWrite() throws InterruptedException {
            countRequestingWriter++;
            while (countRunningReader > 0 || countRunningWriter > 0) {
                wait();
            }
            countRequestingWriter--;
            countRunningWriter++;
        }

        public synchronized void unlockWrite() {
            countRunningWriter--;
            notifyAll();
        }
    }

Ketika lock akan dipakai oleh sebuah thread untuk melakukan write locking, maka lock akan memeriksa apakah sedang dilakukan reading atau writing. Jika ada maka lock akan menunggu. Ketika thread lain selesai melakukan tugasnya maka lock akan memberitahu thread yang menungu itu untuk memeriksa lagi. Jika berhasil maka thread akan menambahkan nilai variabel tersebut. Variabel ini bertugas sebagai semacam semaphore. Untuk menggunakan lock ini, method untuk write dan read harus dimodifikasi.

public void read() {
        System.out.println(strid + ": start!");
        while (true) {
            try {
                lock.lockRead();
                System.out.println(strid + ": start reading!");
                FileInputStream fis = new FileInputStream(fileName);
                byte[] b = new byte[4];
                fis.read(b);
                System.out.println(strid + ": read \"" + new String(b) + "\"");
                fis.close();
                System.out.println(strid + ": done reading!");
                lock.unlockRead();
            } catch (Exception ex) {
                synchronized (System.out) {
                    ex.printStackTrace(System.out);
                }
            }
        }
    }
public void write() {
        System.out.println(strid + ": start!");
        while (true) {
            try {
                lock.lockWrite();
                System.out.println(strid + ": start writing!");
                FileOutputStream fos = new FileOutputStream(fileName);
                String srandom = Long.toString((long) ((new Random()).nextDouble() * 9000) + 1000);
                //Writing random
                System.out.println(strid + ": write \"" + srandom + "\"");
                fos.write(srandom.getBytes());
                fos.close();
                System.out.println(strid + ": done writing!");
                lock.unlockWrite();
            } catch (Exception ex) {
                synchronized (System.out) {
                    ex.printStackTrace(System.out);
                }
            }
        }
    }

Hasilnya, Writers akan serialized dengan seluruh Readers. Contoh keluarannya dapat dilihat di bawah.

..
Writer 1: start writing!
Writer 1: write "8742"
Writer 1: done writing!
Reader 4: start reading!
Reader 2: start reading!
Reader 5: start reading!
Reader 3: start reading!
Reader 5: read "8742"
Reader 5: done reading!
Reader 5: start reading!
Reader 1: start reading!
Reader 1: read "8742"
Reader 3: read "8742"
Reader 3: done reading!
Reader 4: read "8742"
Reader 5: read "8742"
Reader 4: done reading!
...

Kode dapat dilihat di sini. (ganti ekstensi jadi zip)

One Trackback/Pingback

  1. […] Concurrency, Java, Multithreading, Programming Masih melanjutkan tentang The Readers and Writers Problem. Java sudah menyediakan fitur Lock khusus untuk model permasalahan ini yakni ReadWriteLock yang […]

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: