Golang vs Java — Concurrency

Perbedaan Java dan Golang dalam Implementasi Concurrency

D. Husni Fahri Rizal
The Legend
7 min readDec 5, 2020

--

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.

Perbedaan antara Concurrency dan Parallelism

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 6
Process 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 9
Process 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 113
Process 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 :

Kafka T-shirt

Elastic T-shirt

Dapat menghubungi The Legend.

--

--

D. Husni Fahri Rizal
The Legend

Engineering Leader | Start-Up Advisor | Agile Coach | Microservices Expert | Professional Trainer | Investor Pemula