Golang vs Java — Concurrency
Perbedaan Java dan Golang dalam Implementasi Concurrency
Keinginan untuk membahas Golang dan Java sudah lama sekali dan sudah banyak teman yang meminta hal ini. Saya sendiri kebetulan memiliki pengalaman yang cukup lama menggunakan bahasa pemrograman Java dan beberapa tahun ini cukup lumayan bersentuhan dan menggunakan Golang.
Java adalah bahasa pemrograman tingkat tinggi dengan pendekatan object dalam implementasi bahasanya. Java merupakan bahasa pemrograman yang sudah sangat mature dan stabil serta paling banyak digunakan di dunia. Terlebih untuk aplikasi dengan level enterprise rata-rata di atas 80% akan menggunakan Java. Java sendiri lahir sekitar tahun 1990 oleh SUN Microsystem.
Golang adalah bahasa pemrograman yang dibuat oleh perusahaan raksasa Google dengan tujuan awal untuk menggantikan Java pada Android. Golang lahir sekitar tahun 2009 dibuat berdasarkan C dan C++. Memiliki Garbage Collection sama seperti Java dengan perbedaan yakni Golang kode akan di compile menjadi native kode mesin komputer sehingga memiliki rata-rata kinerja yang lebih baik dibandingkan bahasa pemrograman berbasiskan virtual mesin.
Golang hampir menyerupai OOP seperti Java tetapi tidak sepenuhnya OOP atau untuk saat ini belum bisa disebutkan sebagai bahasa pemrograman full OOP. Golang lebih mengutamakan kemudahan dan strike forward akan tetapi cukup agak merepotkan karena kekurangan dukungannya terhadap OOP.
Concurrency adalah teknik pemrograman yang digunakan untuk menyelesaikan permasalahan dengan banyak request atau banyak prosess yang diselesaikan dalam waktu yang sama.Ciri utama dari proses concurrent adalah proses satu dengan proses yang lain tidak akan bisa dilakukan secara bersamaan pada suatu resource tertentu. Biasanya proses satu bergantian dengan proses lainnya. Dikarenakan sangat cepat jadi terkadang terlihat seperti dilakukan bersamaan.
Kalau kita coba analogikan, proses concurrent ini seperti seorang pekerja restoran yang menghandle banyak permintaan. Dia akan menumpuk semua permintaan yang datang dan diselesaikan satu persatu. Dengan cara demikian, jika semua proses dilakukan oleh sendiri maka proses menjadi lama karena terjadi antrian dan pekerja ini kelelahan. Untuk memproses permintaan yang banyak ini maka solusinya ada melakukan tambahan pekerja sehingga proses kerja bisa dilakukan secara bersamaan dan pelayanan terhadap permintaan pengunjung menjadi lebih cepat.
Berbeda dengan konsep Parallelism yang kadang suka dikaburkan dengan konsep concurrency. Paralel proses adalah cara menyelesaikan satu permasalah yang besar yang kalau dilakukan secara biasa membutuhkan waktu yang sangat lama. Solusi dilakukan dengan cara memecah menjadi bagian-bagian yang lebih kecil. Task-task kecil ini terbebas dan tidak saling mempengaruhi satu sama lain dan diselesaikan secara serempak dan bersamaan.
Pada teknik parallel programming pasti terdapat concurrency akan tetapi pada concurrency belum tentu terjadi paralel proses.
Java menggunakan Thread OS dalam menyelesaikan proses parallel melalui thread yang dikelola atau di manage oleh java runtime. Adapun Golang menyelesaikan parallel proses dengan menggunakan thread os melalui Goroutine. Pada konsep parallel antar java dan golang tidak ada perbedaan yang jauh dan hampir sama cuma berbeda nama.
Berbeda apabila dalam hal konsep concurrency. Pada java dilakukan dengan melakukan mapping thread java runtime ke dalam thread os. Sedangkan pada golang dengan melakukan mapping goroutine ini ke level yang lebih dalam dengan abstraksi sebuah scheduler pada golang.
Goroutine sendiri bukanlah sistem thread atau thread yang di manage oleh thread os. Akan tetapi, idenya lebih kepada sebuah Multiplexer yang memproses sebuah fungsi corutines ke dalam thread os. Sehingga ketika terjadi blocking proses maka akan di pindah ke thread yang tidak digunakan atau green thread.Go scheduler bertugas untuk melakukan mapping green thread ini ke thread os dan mendistribusikan go routines kedalam green thread yang idle.
Konsep goroutine ini sepintas hampri sama dengan konsep non blokingnya reactive java yang diwakili oleh Reactore 3 atau RxJava pada Reactive.io. Akan Tetapi, konsep reactive stream java memiliki pendekatan yang lebih advanced daripada goroutine. Apabila dibandingkan Java Reactive Stream ini apple to apple dengan Reactive Golang (RxGo).
Model Concurenncy Java dan Golang
Walaupun bebeda cara pendekatan implementasi pada masaah concurency akan tetapai model nya hampir sama. Sebagai contoh berikut.
Asynchronous Proses
Java
- Membuat classs yang merupakan turunan dari Thread class.
- Mengimplemetasi interface runnable.
Golang
- Start goroutine
Synchronous Proses
Java
- Synchronized block pada method.
- Menggunakan Lock.ReentrantLock yang ada pada package java.util.concurrent
Golang
Menggunakan konsep Channel yaitu implementasi dari jargonnya “ Tidak berkomunikasi dengan cara berbagi memori dan tidak berbagi memori dengan melakukan komunikasi”.
- Sync.Mutex untuk melakukan locking terhadap suatu resource.
Inter Proses Komunikasi
Java
- Menggunakan method object.wait(), object.Notify() atau object.NotifyAll().
- Melakukan sharing block queue pada beberapa thread
- Menggunakan methode PipeReader dan PipeWriter
Golang
- Menggunakan Channel
- Menggunakan WaitGroup
Sample Code
SampleTask.java
ApplicationMain.java
Apabila kita execute code main di atas akan menghasilkan.
SSebuah task sudah di tambahkan dengan nama Task ke 0
Sebuah task sudah di tambahkan dengan nama Task ke 1
Sebuah task sudah di tambahkan dengan nama Task ke 2
Sebuah task sudah di tambahkan dengan nama Task ke 3
Sebuah task sudah di tambahkan dengan nama Task ke 4
Sebuah task sudah di tambahkan dengan nama Task ke 5
Sebuah task sudah di tambahkan dengan nama Task ke 6
Sebuah task sudah di tambahkan dengan nama Task ke 7
Sebuah task sudah di tambahkan dengan nama Task ke 8
Sebuah task sudah di tambahkan dengan nama Task ke 9
Maksimun thread yang terjadi adalah 6
Pengerjaan Task Task ke 0
Pengerjaan Task Task ke 1
Pengerjaan Task Task ke 3
Pengerjaan Task Task ke 2
Pengerjaan Task Task ke 4
Pengerjaan Task Task ke 5
Pengerjaan Task Task ke 9
Pengerjaan Task Task ke 8
Pengerjaan Task Task ke 7
Pengerjaan Task Task ke 6Process finished with exit code 0
Dari output kode diatas terlihat bahwa proses dilakukan secara asynchronous karena jumlah thread yang di sediakan ada 6. Apabila thread pool kita buat 1 misalkan maka hasilnya selalu seperti berikut.
Sebuah task sudah di tambahkan dengan nama Task ke 0
Sebuah task sudah di tambahkan dengan nama Task ke 1
Sebuah task sudah di tambahkan dengan nama Task ke 2
Sebuah task sudah di tambahkan dengan nama Task ke 3
Sebuah task sudah di tambahkan dengan nama Task ke 4
Sebuah task sudah di tambahkan dengan nama Task ke 5
Sebuah task sudah di tambahkan dengan nama Task ke 6
Sebuah task sudah di tambahkan dengan nama Task ke 7
Sebuah task sudah di tambahkan dengan nama Task ke 8
Sebuah task sudah di tambahkan dengan nama Task ke 9
Maksimun thread yang terjadi adalah 1
Pengerjaan Task Task ke 0
Pengerjaan Task Task ke 1
Pengerjaan Task Task ke 2
Pengerjaan Task Task ke 3
Pengerjaan Task Task ke 4
Pengerjaan Task Task ke 5
Pengerjaan Task Task ke 6
Pengerjaan Task Task ke 7
Pengerjaan Task Task ke 8
Pengerjaan Task Task ke 9Process finished with exit code 0
Proses dilakukan secara synchronous karena pool yang tersedia cuma 1.
main.go
Apabila code golang di atas kita eksekusi maka didapat output sebagai berikut.
Urutan loop ke : 1
Angka bilangan prima hasil generate adalah 2
Urutan loop ke : 2
Angka bilangan prima hasil generate adalah 3
Urutan loop ke : 3
Angka bilangan prima hasil generate adalah 5
Urutan loop ke : 4
Angka bilangan prima hasil generate adalah 7
Urutan loop ke : 5
Angka bilangan prima hasil generate adalah 11
Urutan loop ke : 6
Angka bilangan prima hasil generate adalah 13
Urutan loop ke : 7
Angka bilangan prima hasil generate adalah 17
Urutan loop ke : 8
Angka bilangan prima hasil generate adalah 19
Urutan loop ke : 9
Angka bilangan prima hasil generate adalah 23
Urutan loop ke : 10
Angka bilangan prima hasil generate adalah 29
Urutan loop ke : 11
Angka bilangan prima hasil generate adalah 31
Urutan loop ke : 12
Angka bilangan prima hasil generate adalah 37
Urutan loop ke : 13
Angka bilangan prima hasil generate adalah 41
Urutan loop ke : 14
Angka bilangan prima hasil generate adalah 43
Urutan loop ke : 15
Angka bilangan prima hasil generate adalah 47
Urutan loop ke : 16
Angka bilangan prima hasil generate adalah 53
Urutan loop ke : 17
Angka bilangan prima hasil generate adalah 59
Urutan loop ke : 18
Angka bilangan prima hasil generate adalah 61
Urutan loop ke : 19
Angka bilangan prima hasil generate adalah 67
Urutan loop ke : 20
Angka bilangan prima hasil generate adalah 71
Urutan loop ke : 21
Angka bilangan prima hasil generate adalah 73
Urutan loop ke : 22
Angka bilangan prima hasil generate adalah 79
Urutan loop ke : 23
Angka bilangan prima hasil generate adalah 83
Urutan loop ke : 24
Angka bilangan prima hasil generate adalah 89
Urutan loop ke : 25
Angka bilangan prima hasil generate adalah 97
Urutan loop ke : 26
Angka bilangan prima hasil generate adalah 101
Urutan loop ke : 27
Angka bilangan prima hasil generate adalah 103
Urutan loop ke : 28
Angka bilangan prima hasil generate adalah 107
Urutan loop ke : 29
Angka bilangan prima hasil generate adalah 109
Urutan loop ke : 30
Angka bilangan prima hasil generate adalah 113Process finished with exit code 0
Dari code di atas perintah untuk menjalankan suatu method dalan go routine cukup dengan menambahkan perintah go di depan method yang akan di proses.
Itulah perbandingan cara implementasi Golang dan Java terhadap concurrency. Kita tidak membahas mana yang memiliki performance lebih bagus diantara keduanya. Bahasa pemrograman Go dan Java memiliki kelebihan dan kekurang masing-masing, Mungkin pembahasan selanjutnya kita coba membandingkan parallel programming pada kedua bahasa ini.
Sponsor
Membutuhkan kaos dengan tema pemrograman :
Dapat menghubungi The Legend.