Dokumen ini membahas tentang konsep concurrency pada pemrograman berorientasi objek dengan menggunakan bahasa pemrograman Java. Concurrency digunakan untuk menjalankan beberapa instruksi secara bersamaan menggunakan thread. Dokumen ini juga membahas implementasi thread, perbedaan proses dan thread, interrupts, sinkronisasi, race condition, deadlock, livelock dan starvation. Diberikan contoh kode untuk mendemonstrasikan penggunaan thread.
2. Pendahuluan
Concurrency pada konsep pemrograman berorientasi objek
adalah bertujuan untuk menjalankan beberapa instruksi
secara bersamaan (simultan).
Dalam aplikasi atau program tertentu ada kalanya perlu
menggunakan concurrency untuk melakukan pemrosesan
sekaligus.
3. Implementasi Concurrency
Karena bahasa yang diggunakan pada pemrograman
berorientasi objek di materi ini adalah Java, maka
concurrency akan berkaitan dengan process dan thread.
Pada umumnya, diimplementasikan dengan Thread.
Setiap thread diasosiasikan dengan sebuah instansiasi
dari class Thread
4. Process dan Thread
Thread adalah bagian dari sebuah process.
Sebuah proses dapat memiliki banyak thread (multiple
thread).
Perbedaan proses dan thread adalah pada memory. Tiap
proses memiliki memory space sendiri yang terpisah,
sedangkan thread akan memakan memory space yang
sama.
5. Interrupts
Sebuah thread pasti akan mengeksekusi instruksi-instruksi
tertentu. Dalam eksekusinya tidak dipastikan akan selalu
berjalan dengan baik.
Interrupt adalah method pada objek thread yang dipanggil
ketika menangani kesalahan tertentu dengan mengirimkan
interupsi.
Interrupt perlu diimplementasi sebagai salah satu
penanganan kesalahan (error handling)
6. Sinkronisasi (Syncrhonization)
Thread-thread dapat berkomunikasi dengan objek lain yang
sama ataupun berbeda.
Sinkronisasi dibutuhkan untuk mencegah adanya
interferensi thread dan memory consistency error.
Error ini akan terjadi ketika lebih dari satu thread
mengakses objek data yang sama dengan sinkronisasi
yang tidak tepat.
7. Race Condition
Race condition adalah sebuah kondisi yang merupakan bug
atau error pada program karena eksekusi instruksi secara
paralel oleh banyak thread sekaligus.
Kondisi ini merupakan salah satu kesalahan yang sering
terjadi pada aplikasi atau program yang konkuren, misal
dengan menggunakan bahasa pemrograman Java.
8. Race Condition - 2
Race condition terjadi apabila thread yang berbeda
beroperasi pada objek yang sama tanpa sinkronisasi yang
tepat (interleave) dan mengakibatkan gangguan.
Contoh:
Proses inkremental. Apabila 2 buah thread mengakses data yang sama secara
bersamaan, misalkan “5”. Thread itu akan membaca data yang sama (5) dan
keduanya menambahkannya menjadi “6”. Proses akan kehilangan 1 hitungan,
karena seharusnya inkremen dilakukan 2 kali sehingga seharusnya nilai
akhirnya “7”.
9. Deadlock dan Livelock
Deadlock adalah proses dimana 2 atau lebih thread saling
menunggu untuk melepas resource yang digunakan dan
mengakibatkan stuck dalam waktu yang tak terbatas.
Livelock adalah keadaan dimana dua atau lebih thread
saling berbagi respon secara bergantian dan banyak
sehingga program atau aplikasi menjadi stuck. (terlalu
sibuk menangani respons)
10. Starvation
Stravation adalah kondisi dimana salah satu thread tidak
dapat mengakses ke shared resource dan tidak dapat
melanjutkan prosesnya.
Hal ini terjadi karena adanya pemakaian resource yang
terlalu lama oleh thread lain (greedy thread), sehingga
resource tidak dapat digunakan (unavailable).
11. Contoh Implementasi
class PrintDemo {
public void printCount(){
try {
for(int i = 5; i > 0; i--) {
System.out.println("Counter --- " + i );
}
} catch (Exception e) {
System.out.println("Thread interrupted.");
}
}
}
...