Modul D: Deadlock dalam Java dan Solusi Terkait
Deadlock dalam Java dan Solusi Terkait
disusun untuk memenuhi
tugas mata kuliah Sistem Operasi
Oleh:
ALFI ZAMRIZA
2208107010080
SEMESTER 3
JURUSAN INFORMATIKA
FAKULTAS METEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS SYIAH KUALA
DARUSSALAM, BANDA ACEH
2023
Soal:
Deadlock in Java
- TestDeadlockExample1.java
- DeadlockSolved.java
- ProducerConsumerTest.Java
Penyelesaian:
1. TestDeadlockExample1.java
Code:
public class TestDeadlockExample1 {
public static void main(String[] args) {
final String resource1 = "ratan jaiswal";
final String resource2 = "vimal jaiswal";
// t1 tries to lock resource1 then resource2
Thread t1 = new Thread() {
public void run() {
synchronized (resource1) {
System.out.println("Thread 1: locked resource 1");
try {
Thread.sleep(100);
} catch (Exception e) {
}
synchronized (resource2) {
System.out.println("Thread 1: locked resource 2");
}
}
}
};
// t2 tries to lock resource2 then resource1
Thread t2 = new Thread() {
public void run() {
synchronized (resource2) {
System.out.println("Thread 2: locked resource 2");
try {
Thread.sleep(100);
} catch (Exception e) {
}
synchronized (resource1) {
System.out.println("Thread 2: locked resource 1");
}
}
}
};
t1.start();
t2.start();
}
}
Output:
Thread 1: locked resource 1
Thread 2: locked resource 2
Kode tersebut adalah contoh deadlock yang terjadi ketika dua thread berusaha mengunci sumber daya yang saling bergantung. Dalam contoh ini, ada dua sumber daya: `resource1` dan `resource2`. Thread t1 mencoba mengunci `resource1` terlebih dahulu, sementara thread t2 mencoba mengunci `resource2` terlebih dahulu. Kedua thread kemudian mencoba mengunci sumber daya yang tersisa. Namun, karena kedua thread saling menunggu satu sama lain untuk melepaskan sumber daya yang mereka kunci, deadlock terjadi, dan program akan terjebak dalam keadaan yang tidak dapat dilanjutkan.
2. DeadlockSolved.java
Code:
public class DeadlockSolved {
public static void main(String ar[]) {
DeadlockSolved test = new DeadlockSolved();
final resource1 a = test.new resource1();
final resource2 b = test.new resource2();
// Thread-1
Runnable b1 = new Runnable() {
public void run() {
synchronized (b) {
try {
/* Adding delay so that both threads can start trying to lock resources */
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Thread-1 have resource1 but need resource2 also
synchronized (a) {
System.out.println("In block 1");
}
}
}
};
// Thread-2
Runnable b2 = new Runnable() {
public void run() {
synchronized (b) {
// Thread-2 have resource2 but need resource1 also
synchronized (a) {
System.out.println("In block 2");
}
}
}
};
new Thread(b1).start();
new Thread(b2).start();
}
// resource1
private class resource1 {
private int i = 10;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
// resource2
private class resource2 {
private int i = 20;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
}
Output:
PS E:\KULIAH\SO\Synchronization - lab JIF SO 2023> java DeadlockSolved
In block 1
In block 2
Kode ini adalah contoh penanganan deadlock dalam Java. Dalam contoh ini, dua thread mencoba mengunci dua sumber daya yang berbeda, `resource1` dan `resource2`. Thread pertama (`b1`) mengunci `resource2` dan mencoba mengunci `resource1`, sedangkan thread kedua (`b2`) mengunci `resource1` dan mencoba mengunci `resource2`.
Deadlock adalah situasi di mana kedua thread terjebak karena masing-masing menunggu sumber daya yang telah dikunci oleh yang lain. Penanganan deadlock dalam contoh ini tidak ada, sehingga program mungkin akan berhenti atau terjebak dalam keadaan tidak dapat dilanjutkan.
Solusi untuk menghindari deadlock adalah dengan mengatur urutan penguncian sumber daya yang konsisten di seluruh program, atau menggunakan mekanisme lain seperti `java.util.concurrent` untuk mengelola sumber daya secara lebih aman.

Comments
Post a Comment