Laporan Praktikum Sistem Operasi
PENDAHULUAN
Deadlock in Java.
Deadlock di Java adalah situasi di mana dua atau lebih utas (threads) terjebak dalam sebuah situasi di mana mereka saling menunggu untuk sumber daya yang dikunci oleh utas lain. Ini terjadi ketika dua utas atau lebih berusaha mengunci sumber daya yang dimiliki oleh utas lain, dan keduanya terjebak dalam siklus penungguan yang tidak dapat berakhir. Akibatnya, tidak ada utas yang dapat melanjutkan eksekusi dan program akan terhenti.
Sebuah contoh sederhana yang dapat membantu memahami deadlock adalah ketika dua utas (Utas A dan Utas B) mencoba mengunci dua sumber daya (Sumber Daya X dan Sumber Daya Y) dalam urutan yang berbeda. Jika Utas A mengunci Sumber Daya X dan Utas B mengunci Sumber Daya Y, dan kemudian keduanya mencoba mengunci sumber daya yang dimiliki oleh utas lain (Y oleh A dan X oleh B), mereka akan terjebak dalam deadlock karena keduanya akan saling menunggu untuk melepaskan sumber daya yang mereka butuhkan.
Solusi untuk deadlock melibatkan manajemen penguncian sumber daya dengan hati-hati, penggunaan penguncian selama waktu yang sangat singkat, dan merancang algoritma yang menghindari penungguan silang sumber daya. Deadlock adalah masalah yang kompleks dalam pemrograman multithreading, dan mencegahnya merupakan tantangan yang penting dalam pengembangan perangkat lunak yang melibatkan banyak utas.
BAB I
PENDAHULUAN
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 TestDeadlockExample1.java
1. Kode program asli TestDeadlockExample1.java
Kode program ini adalah contoh sederhana dari deadlock dalam lingkungan multithreading di Java. Deadlock terjadi ketika dua utas (threads) atau lebih berusaha mengunci sumber daya yang sedang digunakan oleh utas lain, dan keduanya terjebak dalam siklus penungguan yang tidak dapat berakhir.Poin-poin penting dalam kode tersebut:
- Ada dua sumber daya string: resource1 dan resource2.
- Terdapat dua utas: t1 dan t2.
- t1 mencoba mengunci resource1 terlebih dahulu, dan kemudian resource2. Sementara t2 mencoba mengunci resource2 terlebih dahulu, dan kemudian resource1.
- Setiap utas memiliki blok synchronized yang mencoba mengunci sumber daya yang sesuai.
- Ada penundaan 100 milidetik (Thread.sleep(100)) dalam setiap utas untuk mensimulasikan pemrosesan yang memerlukan waktu.
Proses deadlock:
- t1 mengunci resource1, dan t2 mengunci resource2.
- Kemudian, t1 mencoba mengunci resource2, tetapi resource2 sudah terkunci oleh t2. Sebaliknya, t2 mencoba mengunci resource1, tetapi resource1 sudah terkunci oleh t1.
- Akibatnya, keduanya terjebak dalam deadlock. Kedua utas akan saling menunggu untuk melepaskan sumber daya yang mereka butuhkan, yang tidak akan pernah terjadi. Program akan terjebak dalam kondisi ini dan tidak akan berlanjut.
Ini adalah contoh yang sederhana tetapi efektif untuk menjelaskan konsep deadlock dalam pemrograman multithreading. Penting untuk merancang aplikasi multithreading dengan hati-hati dan memastikan penguncian sumber daya tidak mengarah pada situasi deadlock.
2. Kode program TestDeadlockExample1.java dengan output A, B, C
Kode ini sebenarnya adalah program yang sama dengan sebelumnya. Hanya terdapat perbedaan pada outputnya saja.
Program 2 DeadlockSolved.java
1. Kode program asli DeadlockSolved.java
Kode ini adalah contoh kode Java yang menciptakan deadlock (kondisi ketika dua atau lebih thread terjebak dalam situasi di mana mereka saling menunggu untuk sumber daya yang sama, sehingga tidak ada thread yang dapat melanjutkan).
- Kode dimulai dengan mendefinisikan sebuah kelas bernama "DeadlockSolved."
- Dalam metode "main" (method utama), kita membuat objek "test" dari kelas "DeadlockSolved".
- Kemudian, dua objek yang disebut "resource1" (a) dan "resource2" (b) dibuat sebagai inner class dari objek "test." Ini adalah sumber daya yang akan diakses oleh dua thread.
- Selanjutnya, kita membuat dua thread, "b1" dan "b2." Thread "b1" mencoba mengunci sumber daya "b" terlebih dahulu, kemudian menunggu selama 100 milidetik, dan mencoba untuk mengunci sumber daya "a." Thread "b2" melakukannya dalam urutan yang berlawanan.
- Dalam blok "run" dari "b1" dan "b2," masing-masing thread mencoba mengunci dua sumber daya. Ini adalah inti dari potensi deadlock. Kedua thread mencoba mengunci sumber daya yang dibutuhkan oleh thread lain, dan ini bisa mengakibatkan keduanya terjebak, karena keduanya menunggu sumber daya yang tidak akan pernah dilepaskan oleh thread lain.
- Terakhir, kita memulai kedua thread menggunakan "new Thread(b1).start();" dan "new Thread(b2).start();."
Kode ini diciptakan untuk menunjukkan bagaimana deadlock terjadi saat dua thread mencoba mengunci dua sumber daya dalam urutan yang berbeda. Dalam contoh ini, "b1" mencoba mengunci "b" terlebih dahulu, sedangkan "b2" mencoba mengunci "a" terlebih dahulu. Karena keduanya saling menunggu satu sama lain untuk melepaskan sumber daya yang mereka butuhkan, deadlock terjadi dan program tidak akan pernah selesai
Program 3 ProducerConsumerTest.Java
1. Kode asli ProducerConsumerTest.Java
Kode tersebut adalah contoh implementasi masalah Produsen-Konsumen (Producer-Consumer) menggunakan Java. Masalah Produsen-Konsumen adalah salah satu masalah klasik dalam pemrograman konkurensi di mana ada dua jenis tugas: produsen yang menghasilkan data dan konsumen yang mengonsumsi data.Kita memiliki tiga kelas dalam kode ini:
- ProducerConsumerTest: Ini adalah kelas utama yang memiliki metode main. Di dalam metode main, kita membuat objek CubbyHole yang akan digunakan sebagai wadah berbagi antara produsen dan konsumen. Kemudian, kita membuat satu objek produsen (p1) dan satu objek konsumen (c1) yang akan berbagi wadah ini. Kemudian, kita memulai kedua thread produsen dan konsumen.
- CubbyHole: Ini adalah kelas yang mewakili wadah (buffer) berbagi di antara produsen dan konsumen. Wadah ini memiliki dua atribut: contents untuk menyimpan data yang akan dibagi dan available yang menunjukkan apakah data tersedia. Terdapat dua metode dalam kelas ini, yaitu get (untuk konsumen) dan put (untuk produsen). Kedua metode ini menggunakan sinkronisasi (synchronized) untuk memastikan bahwa akses ke wadah dibagi dengan aman dan menghindari masalah perlombaan (race conditions).
- Consumer dan Producer: Kedua kelas ini adalah subkelas dari Thread dan mewakili produsen dan konsumen. Mereka memiliki metode run yang akan dieksekusi ketika thread dimulai. Produsen (Producer) menghasilkan data (dalam bentuk angka) dan menaruhnya di dalam wadah (CubbyHole) menggunakan metode put. Konsumen (Consumer) mengambil data dari wadah menggunakan metode get dan mencetaknya ke layar.
Ketika menjalankan program ini, akan terlihat bahwa produsen menghasilkan data, memasukkannya ke dalam wadah, dan konsumen mengambil data dari wadah. Sinkronisasi menggunakan metode wait(), notifyAll(), dan blok synchronized memastikan bahwa produsen dan konsumen berkoordinasi dengan benar sehingga tidak ada konflik dalam akses data. Itu adalah cara sederhana untuk menyelesaikan masalah Produsen-Konsumen dalam pemrograman konkurensi.
2. Kode program ProducerConsumerTest.Java dengan output A, B, C

Komentar
Posting Komentar