J. E. N. I.
Program ini diharapkan dapat mencetak dua argument object Runnable secara berurutan. Permasalahannya adalah, pendeklarasian method sleep akan menyebabkan thread yang lain akan dieksekusi walaupun thread yang pertama belum selesai dijalankan pada saat eksekusi method print dari class TwoStrings. Berikut ini adalah contoh dari keluarannya.
Hello How are Thank you there. you? very much!
Pada saat berjalan, ketiga thread telah mencetak argument string pertama mereka sebelum argument kedua dicetak. Sehingga hasilnya adalah sebuah keluaran yang tidak jelas.
Sebenarnya, pada contoh diatas, tidak menunjukkan permasalahan yang serius. Akan tetapi pada aplikasi yang lain hal ini dapat menimbulkan exception atau permasalahanpermasalahan tertentu.
9.5.2 Mengunci Object
Untuk memastikan bahwa hanya satu thread yang mendapatkan hak akses kedalam method tertentu, Java memperbolehkan penguncian terhadap sebuah object termasuk method-method-nya dengan menggunakan monitor. Object tersebut akan menjalankan sebuah monitor implicit pada saat object dari method sinkronisasi dipanggil. Sekali object tersebut dimonitor, monitor tersebut akan memastikan bahwa tidak ada thread yang akan mengakses object yang sama. Sebagai konsekuensinya, hanya ada satu thread dalam satu waktu yang akan mengeksekusi method dari object tersebut.
Untuk sinkronisasi method, keyword-nya adalah synchronized yang dapat menjadi header dari pendefinisian method. Pada kasus ini dimana Anda tidak dapat memodifikasi source code dari method, Anda dapat mensinkronisasi object dimana method tersebut menjadi anggota. Syntax untuk mensinkronisasi sebuah object adalah sebagai berikut:
synchronized(< object >) { // statements yang akan disinkronisasikan
}
Dengan ini, object dari method tersebut hanya dapat dipanggil oleh satu thread pada satu waktu.
9.5.3 Contoh Synchronized Pertama
Dibawah ini adalah kode yang telah dimodifikasi dimana method print dari class TwoStrings saat ini sudah disinkronisasi.
class TwoStrings { synchronized static void print( String str1, String str2) { System. out. print( str1); try {
Thread. sleep( 500); } catch( InterruptedException ie) { }
Pengenalan Pemrograman 2 10