๐งท Sinkronisasi dengan synchronized di Java¶
Ketika beberapa thread mengakses data atau resource yang sama, risiko konflik seperti race condition bisa terjadi.
Untuk mencegahnya, Java menyediakan keyword synchronized โ seperti lampu merah bagi thread ๐ฆ
๐ฅ Masalah Tanpa Sinkronisasi¶
public class Counter implements Runnable {
private int hitung = 0;
public void tambah() {
hitung++;
}
public void run() {
for (int i = 0; i < 1000; i++) tambah();
}
public static void main(String[] args) throws InterruptedException {
Counter c = new Counter();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start(); t2.start();
t1.join(); t2.join();
System.out.println("Total: " + c.hitung); // hasil bisa acak!
}
}
````
---
## โ
Solusi: Gunakan `synchronized`
### ๐ Pada Method
```java
public synchronized void tambah() {
hitung++;
}
๐ Pada Blok¶
public void tambah() {
synchronized (this) {
hitung++;
}
}
๐ synchronized Static¶
Jika method static, maka kunci berlaku untuk class, bukan objek.
public static synchronized void tulis() {
// hanya 1 thread bisa akses method ini di seluruh JVM
}
๐ก Contoh: ATM Simulasi¶
class ATM {
private int saldo = 1000;
public synchronized void tarik(int jumlah) {
if (saldo >= jumlah) {
System.out.println(Thread.currentThread().getName() + " menarik " + jumlah);
saldo -= jumlah;
System.out.println("Sisa saldo: " + saldo);
} else {
System.out.println("Saldo tidak cukup untuk " + Thread.currentThread().getName());
}
}
}
๐ synchronized vs Lock¶
| Fitur | synchronized |
Lock (java.util.concurrent.locks) |
|---|---|---|
| Syntax | Mudah & ringkas | Lebih fleksibel |
| Fitur lanjutan | Tidak tersedia | tryLock, interruptible, dll |
| Performance | Kadang kurang efisien | Lebih optimal di sistem kompleks |
Gunakan ReentrantLock jika butuh kontrol lebih dalam.
โ ๏ธ Best Practice¶
- Gunakan
synchronizedhanya pada bagian kritis (yang akses resource bersama) - Jangan menyinkronkan terlalu luas (bisa menyebabkan deadlock)
- Hindari nested
synchronizedkecuali benar-benar dibutuhkan - Gunakan
volatileuntuk variable yang dibaca banyak thread tanpa sync
๐ Kesimpulan¶
| Konsep | Penjelasan |
|---|---|
synchronized |
Kunci eksklusif agar hanya 1 thread yang akses blok data |
synchronized method |
Otomatis mengunci objek (atau class jika static) |
| Blok sinkron | Bisa hanya pada bagian kritis saja |
| Tujuan utama | Mencegah race condition & data inkonsisten |
โก๏ธ Selanjutnya: Networking (Socket Programming)