Thread lagi : Penggunaan wait() dan synchronized().

Pada awalnya kita sering bingung mengenai penggunaan synchronized() dan wait().

Misalnya pada contoh berikut :

class SuatuThread {

Object obj;

public SuatuThread(Object obj){

this.obj = obj;

}

public void run(){

synchronized (obj) {

obj.wait();

}

}

}

Disini kita sering rancu mengenai baris : obj.wait();

Pengertian awal kita adalah method wait() ini mestinya dipanggil oleh thread untuk menunggu giliran memakai Object obj, tetapi yang kita lihat adalah wait() dipanggil oleh obj itu sendiri (resource yg sedang di-sharing/di-lock/di-synchronized).

Untuk membenahi hal ini kita perlu mengingat bahwa method wait() bukan method dari kelas Thread, melainkan method bawaan dari kelas Object.

Jadi pengertian dari obj.wait()bukan berarti si obj yang menunggu (wait), melainkan berarti thread yang bersangkutan akan menunggu (wait) sampai thread lain selesai menggunakan obj (bisa dilihat di javadoc bagian penjelasan method wait()).

Locking/synchronizing lebih dekat hubungannya dengan suatu object bukan dengan thread, karena thread hanya memerlukan synchronization ketika dia bekerja dengan shared-object.

Maka dari itu di Java, wait() and notify() diasosiasikan dengan kelas Object.

Advertisements

Sinkronisasi, notify() dan notifyAll(), siapa membangunkan siapa?

“Bahwasanya sebuah resource bisa digunakan secara bersama-sama (sharing) tidak hanya oleh dua thread tetapi bisa banyak thread”. Ilustrasinya mungkin bisa dibayangkan pada WC umum (ahaha..):

Ketika thread A memakai resource WC, maka thread-thread yang lain harus menunggu (wait) thread A selesai memakai WC. Setelah A selesai, dia membuka pintu WC yang memberi tanda pada semua thread yang lain (notifyAll) bahwa WC sudah free of charge. Thread-thread yang lain pun berebut untuk mendapatkan hak berikutnya untuk memakai WC.

Dalam praktek Java, thread mana yg memperoleh hak tergantung dari JVM.

Notify() dan notifyAll() hampir sama, hanya saja pada notify() JVM hanya membangunkan salah satu thread secara random.

THREAD..

  • Thread adalah bagian di dalam program yang merupakan sebuah sekuens yang berdiri sendiri dan memiliki kontrol sendiri.
    • Setiap aplikasi java yang sedang berjalan sebenarnya memiliki minimal satu thread yaitu yang dipanggil dari method main().
    • Aplikasi yang memiliki lebih dari satu thread disebut aplikasi multi-threading.