Konkurensi adalah kemampuan untuk menjalankan beberapa bagian program atau beberapa program secara parallel. Java konkurensi sering dikenal juga sebagai java multithreading karena didalam konsep ini terlibat suatu hal yang namanya adalah thread. Pertanyaannya apakah thread itu, apakah sama dengan proses? Baiklah agar lebih jelas berikut ini adalah perbedaannya:
Proses : berjalan secara mandiri dan terisolasi terhadap proses lainnya. Kita tidak dapat secara langsung berbagi data dengan proses lainnya. Sumber daya sebuah proseslah yang dialokasikan untuk itu melalui sistem operasi, seperti memori dan CPU.
Threads : Disebut juga proses ringan yang dapat memiliki stack sendiri namun dapat mengakses berbagi data. Setiap thread memiliki memori cache sendiri-sendiri. Jika thread membaca data yang disharing maka thread akan menyimpan data tersebut pada memory cachenya masing-masing. Sebuah thread dapat membaca ulang data yang disharing, inilah yang menjelaskan model memori java.
Hukum Amdahl's
Konkurensi menjanjikan untuk melakukan beberapa tugas lebih cepat karena tugas ini dibagi menjadi sub-tugas, lalu sub tugas inipun dijalankan secara paralel. Tentu saja waktu selesainya bergantung kepada berapa bagian tugas yang dapat dijalankan secara paralel. Secara teori performa yang mungkin didapatkan jika menggunakan konkurensi dapat dihitung menggunakan Hukum Amdahl's
Jika F adalah presentase program yang tidak dapat dijalankan secara paralel dan N adalah jumlah maksimal proses, maka performa maksimum yang bisa didapat adalah 1/(F + ((1-F)/N))
Masalah Pada Thread
Karena thread memiliki stack sendiri tetapi juga dapat mengakses data yang disharing, maka muncul dua masalah yang perlu diperhatikan yaitu masalah visibility dan akses. Masalah visibility muncul ketika thread A membaca data yang disharing yang telah dirubah oleh thread B dan thread A tidak menyadari hal ini. Masalah akses muncul ketika beberapa thread mengakses dan merubah data sharing yang sama pada satu waktu. Masalah visibility dan akses dapat mengakibatkan:
1. Program tidak berjalan lagi dikarenakan masalah akses data pada konkurensi
2. Program menghasilkan data yang salah
Mengunci dan Mensinkronisasi Thread
Java menyediakan kunci untuk melindungi beberapa bagian kode yang dieksekusi oleh beberapa thread pada waktu yang bersamaan, caranya adalah dengan mendefinisikan method atau kelas dengan keyword synchronized.
Keyword synchronized menjamin:
- Hanya satu thread yang dapat mengeksekusi sebuah blok kode pada satu waktu
- Setiap thread yang yang mengakses blok kode melihat efek semua modifikasi sebelumnya yang dijaga oleh kunci yang sama
Synchronization dibutuhkan untuk mengakases blok kode secara ekslusif dan komunikasi antar thread yang handal. Kita dapat menggunakan keyword synchronization pada pendefinisian method untuk menjamin bahwa hanya akan ada satu thread yang dapat memasuki thread ini dalam waktu yang sama, sedangkan thread yang lain harus menunggu hingga thread yang pertama meninggalkan thread ini.
public synchronized void critial() { // some thread critical stuff // here }
Synchronization dibutuhkan untuk mengakases blok kode secara ekslusif dan komunikasi antar thread yang handal. Kita dapat menggunakan keyword synchronization pada pendefinisian method untuk menjamin bahwa hanya akan ada satu thread yang dapat memasuki thread ini dalam waktu yang sama, sedangkan thread yang lain harus menunggu hingga thread yang pertama meninggalkan thread ini.
Sumber : http://www.vogella.com/articles/JavaConcurrency/article.html