PENDAHULUAN
Memahami masalah tanpa syncroniztion
Dalam konteks pengembangan aplikasi berbasis Java yang melibatkan penggunaan multithreading, pemahaman tentang masalah tanpa sinkronisasi menjadi sebuah tantangan yang mendasar. Multithreading memungkinkan aplikasi untuk menjalankan beberapa utas (threads) secara paralel, yang pada dasarnya dapat meningkatkan efisiensi dan kinerja. Namun, dengan potensi ini juga muncul masalah yang berkaitan dengan akses bersama ke data yang dapat mengakibatkan situasi yang disebut race conditions, di mana dua atau lebih utas bersaing untuk mengakses dan memodifikasi data bersama tanpa koordinasi. Race conditions ini dapat menghasilkan hasil yang tidak konsisten dan sulit diprediksi, dan dapat menyebabkan bug yang sulit ditemukan. Oleh karena itu, pemahaman yang kuat tentang cara mengatasi masalah tanpa sinkronisasi menjadi esensial dalam pengembangan perangkat lunak yang memanfaatkan multithreading. Sebagai contoh, race condition dapat terjadi pada kasus berikut:
Anggaplah sebuah aplikasi e-commerce yang memungkinkan beberapa pengguna untuk membeli produk secara bersamaan. Aplikasi ini memiliki mekanisme perhitungan diskon untuk setiap pembelian. Dua pengguna, Alice dan Bob, berbelanja secara bersamaan. Mereka masing-masing memiliki saldo awal sebesar $100 di akun mereka. Mereka memutuskan untuk membeli produk yang sama dengan harga $80 yang memiliki diskon sebesar 10% jika pembelian dilakukan lebih dari satu kali dengan skenario pembelian:
- Alice: Melihat saldo $100 dan membeli produk seharga $80.
- Bob: Melihat saldo $100 dan juga membeli produk seharga $80.
Dalam hal ini, terdapat race condition yang dapat terjadi pada perhitungan diskon. Jika aplikasi tidak dirancang dengan benar, ini mungkin terjadi:
- Alice: Melihat saldo $100, membeli produk seharga $80, dan menghitung diskon dengan benar. Akhirnya, saldo menjadi $100 - $80 + ($80 * 0.10) = $112.
- Bob: Melihat saldo $100 (belum diperbarui oleh Alice), membeli produk seharga $80, dan menghitung diskon tanpa memperhatikan bahwa diskon seharusnya hanya diberikan sekali. Akhirnya, saldo menjadi $100 - $80 + ($80 * 0.10) = $112.
Race condition terjadi ketika aplikasi tidak memiliki mekanisme untuk menghindari diskon diberikan lebih dari sekali. Ini mengakibatkan diskon diberikan ganda, yang seharusnya tidak terjadi. Untuk menghindari race condition dalam kasus seperti ini, aplikasi perlu memiliki kontrol yang memastikan bahwa diskon hanya diberikan satu kali, bahkan jika ada pembelian bersamaan. Hal ini dapat dicapai dengan menggunakan sinkronisasi atau mekanisme lain yang memastikan koordinasi yang benar antara operasi pembelian yang berlangsung bersamaan.
BAB II
PEMBAHASAN
SOAL
1. Praktikan menulis ulang kode dan memastikan program jalan normal.
2. Mengganti dari mencetak angka menjadi mencetak huruf A, B, C dstnya.
Program 1 TestSynchronization1.java
1. kode program asli TestSynchronization1.java
Kode program ini adalah contoh penggunaan sinkronisasi dalam pemrograman multithreading. Ide dasarnya adalah memiliki dua utas (threads), yaitu t1 dan t2, yang mencetak tabel perkalian angka dengan menggunakan objek Table.Pertama, kita memiliki kelas Table. Ini adalah kelas yang memiliki metode printTable(int n) yang mencetak tabel perkalian untuk angka n. Metode ini memiliki loop yang berjalan dari 1 hingga 5 dan mencetak hasil perkalian setiap angka dengan n.Selanjutnya, kita memiliki dua kelas lain, MyThread1 dan MyThread2, yang mewarisi dari kelas Thread. Setiap kelas ini menerima objek Table sebagai argumen di konstruktor mereka.Di dalam metode run() dari masing-masing kelas MyThread1 dan MyThread2, kita memanggil metode printTable pada objek Table yang diteruskan kepada mereka.Terakhir, dalam kelas TestSynchronization1, kita membuat objek Table yang disebut obj, dan kemudian kita membuat dua utas, t1 dan t2, yang masing-masing akan menjalankan metode printTable pada objek Table yang sama.Kode ini mencetak tabel perkalian untuk angka 5 dan 100 secara bersamaan dalam dua utas yang berbeda. Namun, perlu diperhatikan bahwa metode printTable tidak ditandai sebagai metode yang ter-synchronized. Ini berarti kedua utas (t1 dan t2) bisa saja mencoba menjalankan metode ini secara bersamaan. Jika ini terjadi, maka kita bisa mendapatkan hasil cetakan yang tidak konsisten.Untuk menghindari hasil yang tidak konsisten ini, kita dapat menambahkan kata kunci synchronized sebelum deklarasi metode printTable dalam kelas Table. Ini akan memastikan bahwa hanya satu utas yang dapat menjalankan metode ini pada satu waktu, sehingga hasil cetakan akan konsisten.
2. kode program TestSynchronization1.java dengan output A, B, C
Kode program ini adalah contoh penggunaan multithreading dalam Java untuk mencetak huruf A, B, C, dan seterusnya dalam dua utas yang berbeda secara bersamaan. Kita memiliki beberapa kelas di sini:
- Kelas Table: Ini adalah kelas yang memiliki metode printTable(int n) untuk mencetak huruf dari A hingga E dalam loop. Tiap huruf dihasilkan dengan cara mengganti angka dengan huruf A, B, C, dan seterusnya. Setiap huruf dicetak dan kemudian ada penundaan selama 400 milidetik sebelum mencetak huruf berikutnya.
- Kelas MyThread1 dan MyThread2: Kedua kelas ini adalah turunan dari kelas Thread yang digunakan untuk membuat utas. Mereka menerima objek dari kelas Table sebagai argumen konstruktor.
- Kelas TestSynchronization1: Inilah kelas utama di mana kita membuat objek Table dengan nama obj. Kemudian, kita membuat dua utas, t1 dan t2, yang akan menjalankan metode printTable pada objek Table yang sama.
Kode ini akan mencetak huruf-huruf A sampai E secara bersamaan dalam dua utas yang berbeda. Tetapi, perhatikan bahwa metode printTable tidak ditandai sebagai metode yang ter-synchronized, sehingga kedua utas bisa saja mencoba menjalankan metode ini secara bersamaan. Jika ini terjadi, maka kita bisa mendapatkan urutan pencetakan huruf yang acak dan tidak terprediksi.Untuk memastikan urutan pencetakan huruf yang konsisten, kita bisa menambahkan kata kunci synchronized sebelum deklarasi metode printTable dalam kelas Table. Ini akan memastikan bahwa hanya satu utas yang dapat menjalankan metode ini pada satu waktu, sehingga huruf-huruf akan dicetak dalam urutan yang benar.
Program 2 TestSynchronization2.java
1. Kode program asli TestSynchronization2.java
Kode program ini adalah contoh penggunaan sinkronisasi dalam pemrograman multithreading dengan menggunakan metode yang ditandai sebagai "synchronized." Sinkronisasi digunakan untuk memastikan bahwa hanya satu thread yang dapat menjalankan metode tertentu pada satu waktu.Di sini, kita memiliki beberapa kelas:
- Kelas Table: Ini adalah kelas yang memiliki metode printTable(int n) yang ditandai sebagai "synchronized." Metode ini digunakan untuk mencetak tabel perkalian untuk angka n. Metode ini berisi loop yang mencetak hasil perkalian angka dengan n. Setiap langkah dalam loop dilakukan dengan jeda selama 400 milidetik menggunakan Thread.sleep(400).
- Kelas MyThread1 dan MyThread2: Kedua kelas ini adalah turunan dari kelas Thread yang digunakan untuk membuat utas. Masing-masing menerima objek dari kelas Table sebagai argumen konstruktor.
- Kelas TestSynchronization2: Inilah kelas utama di mana kita membuat objek Table yang disebut obj. Kemudian, kita membuat dua utas, t1 dan t2, yang akan menjalankan metode printTable pada objek Table yang sama.
Apa yang membedakan kode ini dari contoh sebelumnya adalah penggunaan kata kunci "synchronized" pada metode printTable dalam kelas Table. Ini berarti bahwa hanya satu utas dapat menjalankan metode printTable pada objek Table pada satu waktu. Dengan kata lain, utas-utas t1 dan t2 akan bersaing untuk mengakses metode printTable dalam urutan yang diatur.Hasilnya adalah bahwa kedua utas akan mencetak tabel perkalian dengan urutan yang konsisten. Tanpa kata kunci "synchronized," mereka mungkin akan bersaing dan menghasilkan hasil cetakan yang tidak konsisten. Dengan kata lain, ini adalah cara untuk memastikan urutan eksekusi yang benar dalam aplikasi multithreading.
2. kode program TestSynchronization2.java dengan output A, B, C
Kode program ini adalah contoh penggunaan sinkronisasi dalam pemrograman multithreading dengan menggunakan metode yang ditandai sebagai "synchronized." Sinkronisasi digunakan untuk memastikan bahwa hanya satu thread yang dapat menjalankan metode tertentu pada satu waktu.
- Kelas Table1: Ini adalah kelas yang memiliki metode printTable(int n) yang ditandai sebagai "synchronized." Metode ini digunakan untuk mencetak huruf A, B, C, dan seterusnya, yang dihasilkan dengan mengganti angka dengan huruf A, B, C, dan seterusnya. Setiap huruf dicetak dalam loop, dan ada jeda selama 400 milidetik menggunakan Thread.sleep(400) di antara setiap pencetakan huruf.
- Kelas MyThread3 dan MyThread4: Kedua kelas ini adalah turunan dari kelas Thread dan menerima objek dari kelas Table1 sebagai argumen konstruktor.
- Kelas TestSynchronization2: Inilah kelas utama di mana kita membuat objek Table1 yang disebut obj. Selanjutnya, kita membuat dua utas, t1 dan t2, yang akan menjalankan metode printTable pada objek Table1 yang sama.
Ketika program ini dijalankan, hanya satu utas dapat menjalankan metode printTable pada objek Table1 pada satu waktu. Hasilnya adalah bahwa kedua utas, t1 dan t2, akan mencetak huruf-huruf A, B, C, dan seterusnya dalam urutan yang konsisten dan tidak ada kompetisi yang menghasilkan hasil cetakan yang tidak konsisten. Dengan kata lain, ini adalah cara untuk memastikan urutan eksekusi yang benar dalam aplikasi multithreading.

Komentar
Posting Komentar