Skip navigation


Masih melanjutkan tentang The Readers and Writers Problem. Java sudah menyediakan fitur Lock khusus untuk model permasalahan ini yakni ReadWriteLock yang disediakan oleh Concurrent APInya Java. Locking ini mempunyai 2 buah Lock yakni ReadLock yang dapat dimiliki beberapa Reader selama tidak ada Writer yang berjalan dan WriteLock yang ekslusif untuk sebuah Writer. Penggunaannya sangat mirip pada postingan sebelumnya. Kita perlu membuat sebuah instance dari ReadWriteLock tersebut. Karena ReadWriteLock hanya berupa Interface maka kita pakai Class yang sudah ada yakni ReentrantReadWriteLock (meski dengan mudahnya kita dapat membuat sebuah Class ReadWriteLock baru dengan menggunakan kode pada postingan sebelum ini)

    private static ReentrantReadWriteLock rwlock = new ReentrantReadWriteLock();
    private static Lock rlock = rwlock.readLock();
    private static Lock wlock = rwlock.writeLock();

public void read() {
        System.out.println(strid + ": start!");
        while (true) {
            try {
                rlock.lock();
                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!");
                rlock.unlock();
            } catch (Exception ex) {
                synchronized (System.out) {
                    ex.printStackTrace(System.out);
                }
            }
        }
    }
public void write() {
        System.out.println(strid + ": start!");
        while (true) {
            try {
                wlock.lock();
                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!");
                wlock.unlock();
            } catch (Exception ex) {
                synchronized (System.out) {
                    ex.printStackTrace(System.out);
                }
            }
        }
    }

Kodenya dapat dilihat di sini. (Caranya sama seperti sebelumnya)

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: