Laporan Praktikum Sistem Operasi

 

MODUL B
 

disusun untuk memenuhi 
tugas mata kuliah Sistem Operasi
 
Oleh:
 
ANDIKA PEBRIANSYAH
2208107010058


 
 
 
 
JURUSAN INFORMATIKA
FAKULTAS
MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS SYIAH KUALA
DARUSSALAM, BANDA ACEH
2023




BAB I

PENDAHULUAN

    
  1. Example of synchronized method by using annonymous class

   Penggunaan metode yang ditandai sebagai "synchronized" dalam Java adalah cara untuk memastikan bahwa hanya satu utas yang dapat mengakses metode tersebut pada satu waktu. Ini digunakan untuk menghindari race condition dan mengamankan akses ke sumber daya bersama dalam lingkungan multithreading.
 

    Namun, dapat juga menggunakan kelas anonim (anonymous class) untuk mencapai sinkronisasi dengan cara yang lebih ringkas. Dalam hal ini, tidak perlu dibuat kelas terpisah untuk menandai metode sebagai "synchronized." Anda dapat menggunakan metode anonim untuk mencapai tujuan tersebut.
 

    Bayangkan ada dua pintu yang memungkinkan akses ke ruangan yang sama. Jika ingin memastikan hanya satu orang yang dapat masuk ke ruangan pada satu waktu, bisa memiliki petugas keamanan yang mengawasi pintu tersebut. Ini adalah cara tradisional, seperti menggunakan kelas terpisah dengan metode "synchronized."
 

    Namun, jika ingin menghemat waktu dan sumber daya, dapat menggunakan pendekatan metode anonim. Tetap memiliki dua pintu, tetapi memberi masing-masing pintu sensor otomatis yang hanya mengizinkan satu orang masuk pada satu waktu. Dengan kata lain, pintu-pintu ini secara otomatis memberlakukan sinkronisasi tanpa memerlukan petugas keamanan tambahan. 
 

    Dalam konteks pemrograman Java, menggunakan metode anonim dengan "synchronized" mirip dengan pintu otomatis. Menyediakan sinkronisasi pada titik akses tertentu tanpa harus membuat kelas terpisah.

2. Synchronized Block (Blok Sinkronisasi)

    Synchronized block adalah salah satu mekanisme sinkronisasi dalam pemrograman multithreading di Java. Dalam konteks ini, Anda dapat menandai hanya sebagian dari metode dengan blok sinkronisasi, bukan seluruh metode. Ini memungkinkan untuk mengendalikan akses bersama ke sebagian dari kode program, yang bermanfaat saat dalam situasi di mana hanya ingin melindungi akses ke sumber daya bersama dalam waktu singkat, bukan selama seluruh metode dijalankan. 

 

    Contoh sederhana yang mudah dipahami: Bayangkan ada dua kasir di sebuah supermarket, dan mereka bersaing untuk menggunakan satu mesin kasir elektronik. Daripada mengunci seluruh mesin kasir, melainkan memasang pelindung pada bagian di sekitar mesin yang digunakan untuk mengakses sistem pembayaran. Dengan cara ini, satu kasir bisa menggunakan mesin pembayaran tanpa harus menunggu kasir lain yang bekerja di bagian lain.

 

    Dalam konteks pemrograman Java, blok sinkronisasi bekerja serupa. Pengembang menandai hanya sebagian dari kode yang perlu dijalankan secara eksklusif oleh satu utas pada satu waktu, sementara bagian lain dari kode tetap dapat diakses oleh utas lain. Ini membantu meningkatkan efisiensi dalam kasus di mana penguncian (locking) seluruh metode tidak diperlukan. 





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  TestSynchronization3.java

    1.  Kode program asli TestSynchronization3.java

    
    Output:
        

    Penjelasan:

    Kode program ini adalah contoh penggunaan metode yang ditandai sebagai "synchronized" dalam pemrograman multithreading dengan menggunakan kelas anonim (anonymous class). Hal ini memastikan bahwa hanya satu utas yang dapat menjalankan metode tersebut pada satu waktu.
  1. 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 memiliki loop yang mencetak hasil perkalian, dan ada penundaan selama 400 milidetik antara setiap pencetakan.
  2. Kelas TestSynchronization3: Inilah kelas utama. Pada bagian ini, kita membuat objek Table yang disebut obj.
  3. Thread t1 dan t2: Dalam blok kode di bawahnya, kita membuat dua utas (t1 dan t2) menggunakan kelas anonim. Setiap utas menjalankan metode run(). Di dalam metode run(), kita memanggil metode printTable pada objek Table yang sama, yaitu obj.
    Ketika program ini dijalankan, kedua utas (t1 dan t2) akan mencetak tabel perkalian untuk angka 5 dan 100 secara bersamaan. Tapi perbedaannya dengan contoh sebelumnya adalah penggunaan metode anonim. Ini memungkinkan untuk menentukan metode run() langsung di dalam pemanggilan new Thread(), tanpa harus membuat kelas turunan Thread terpisah. Metode tersebut masih menjalankan metode printTable yang ditandai sebagai "synchronized," sehingga urutan pencetakan akan selalu konsisten dan tidak ada kompetisi antara utas-utas untuk mengakses metode tersebut.


    2.  Kode program TestSynchronization3.java dengan output A, B, C


        Output:

    Penjelasan:

    Kode program ini adalah contoh penggunaan metode yang ditandai sebagai "synchronized" dalam pemrograman multithreading. Hal ini digunakan untuk memastikan bahwa hanya satu utas yang dapat menjalankan metode tersebut pada satu waktu, sehingga menjaga koherensi data dan urutan eksekusi yang benar.

    1. Kelas Table: Ini adalah kelas yang memiliki metode printTable(int n) yang ditandai sebagai "synchronized." Metode ini digunakan untuk mencetak huruf A, B, C, dan seterusnya dalam loop. Setiap huruf dihasilkan dengan mengganti angka dengan huruf A, B, C, dan seterusnya. Selain mencetak huruf, metode ini juga memiliki penundaan selama 400 milidetik menggunakan Thread.sleep(400) antara setiap pencetakan.
    2. Kelas TestSynchronization3: Ini adalah kelas utama. Di dalamnya, kita membuat objek Table yang disebut obj. Objek ini akan digunakan oleh dua utas yang berbeda.
    3. Thread t1 dan t2: Di bawahnya, kita membuat dua utas (t1 dan t2) menggunakan kelas anonim. Setiap utas menjalankan metode run(). Di dalam metode run(), kita memanggil metode printTable pada objek Table yang sama, yaitu obj.

    Ketika menjalankan program ini, kedua utas (t1 dan t2) akan mencetak huruf-huruf A sampai E dalam urutan yang benar, tanpa kompetisi antara utas-utas tersebut. Hal ini karena metode printTable ditandai sebagai "synchronized," sehingga hanya satu utas yang dapat mengaksesnya pada satu waktu. Ini adalah contoh bagaimana mengendalikan akses ke metode tertentu dalam lingkungan multithreading untuk menjaga kebenaran urutan eksekusi dan data yang konsisten.


Program 2  TestSynchronizedBlock1.java

    1.  Kode program asli TestSynchronizedBlock1.java

      


      Output:

    Penjelasan:

    Kode program ini adalah contoh penggunaan blok sinkronisasi (synchronized block) dalam pemrograman multithreading di Java. Tujuan dari penggunaan blok sinkronisasi adalah memastikan bahwa hanya satu utas yang dapat menjalankan bagian tertentu dari metode pada satu waktu.

  1. Kelas Table: Ini adalah kelas yang memiliki metode printTable(int n). Di dalam metode ini, kita menggunakan blok sinkronisasi dengan pernyataan synchronized(this). Ini berarti bahwa hanya satu utas dapat memasuki blok sinkronisasi ini pada satu waktu. Dalam blok tersebut, terdapat loop yang mencetak hasil perkalian dari angka n dengan angka 1 hingga 5. Setelah setiap pencetakan, ada penundaan selama 400 milidetik menggunakan Thread.sleep(400).
  2. 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.
  3. Kelas TestSynchronizedBlock1: Ini adalah kelas utama di mana kita membuat objek Table yang disebut obj. Selanjutnya, kita membuat dua utas, t1 dan t2, yang akan menjalankan metode printTable pada objek Table yang sama.

    Ketika menjalankan program ini, kedua utas (t1 dan t2) akan mengakses objek Table yang sama. Namun, karena kita telah menandai blok tertentu dalam metode printTable sebagai "synchronized," hanya satu utas yang dapat masuk ke blok tersebut pada satu waktu. Ini memastikan bahwa hasil perkalian dicetak secara bergantian antara kedua utas dan tidak ada kompetisi untuk mengakses metode yang bersifat kritis.


    2.  Kode program TestSynchronizedBlock1.java dengan output A, B, C

    
Output:

Penjelasan:

    Kode program ini adalah contoh penggunaan blok sinkronisasi (synchronized block) dalam Java untuk mengendalikan akses ke bagian tertentu dari metode dalam lingkungan multithreading. 

  1. Kelas Percobaan: Ini adalah kelas yang memiliki metode printTable(int n). Di dalam metode ini, kita menggunakan blok sinkronisasi dengan pernyataan synchronized(this). Ini berarti hanya satu utas yang dapat masuk ke dalam blok ini pada satu waktu. Di dalam blok tersebut, terdapat loop yang mencetak huruf-huruf A, B, C, dan seterusnya sesuai dengan perhitungan angka. Setelah setiap pencetakan, ada penundaan selama 400 milidetik menggunakan Thread.sleep(400).
  2. Kelas MyThread1 dan MyThread2: Kedua kelas ini adalah turunan dari kelas Thread yang digunakan untuk membuat utas. Masing-masing menerima objek dari kelas Percobaan sebagai argumen konstruktor.
  3. Kelas TestSynchronizedBlock1: Ini adalah kelas utama di mana kita membuat objek Percobaan yang disebut obj. Selanjutnya, kita membuat dua utas, t1 dan t2, yang akan menjalankan metode printTable pada objek Percobaan yang sama.

    Ketika menjalankan program ini, kedua utas (t1 dan t2) akan mengakses objek Percobaan yang sama. Namun, karena kita telah menandai blok tertentu dalam metode sebagai "synchronized," hanya satu utas yang dapat memasuki blok tersebut pada satu waktu. Ini memastikan bahwa huruf-huruf A, B, C, dan seterusnya dicetak secara bergantian antara kedua utas, dan tidak ada kompetisi untuk mengakses metode yang bersifat kritis. Dengan cara ini, dapat menjaga kebenaran urutan eksekusi dan data yang konsisten dalam aplikasi multithreading.


Program 3  TestSynchronizedBlock2.java

    1.  Kode program asli TestSynchronizedBlock2.java


    Output:

    
Penjelasan:

    Kode program ini adalah contoh penggunaan sinkronisasi dalam pemrograman multithreading di Java. Tujuan dari kode ini adalah mengirim pesan menggunakan dua utas yang berjalan secara bersamaan dan memastikan bahwa hanya satu utas yang mengirim pesan pada satu waktu.
  1. Kelas Sender: Ini adalah kelas yang memiliki metode SenderMsg(String msg), yang digunakan untuk mengirim pesan. Metode ini mencetak pesan ke layar, menunggu selama 800 milidetik (0,8 detik), lalu mencetak pesan bahwa pesan telah terkirim.
  2. Kelas SenderWThreads: Ini adalah kelas yang mewarisi dari Thread dan digunakan untuk mengirim pesan dengan menggunakan utas (thread). Ketika Anda membuat objek dari kelas SenderWThreads, Anda memberikan pesan yang akan dikirim dan objek Sender yang digunakan untuk mengirim pesan.
  3. Metode run() dalam SenderWThreads: Ini adalah metode yang dieksekusi ketika utas dimulai. Di dalam metode run(), kita menggunakan blok synchronized(sd) untuk memastikan bahwa hanya satu utas yang dapat mengirim pesan menggunakan objek Sender pada satu waktu. Kemudian, kita memanggil metode SenderMsg(msg) pada objek Sender.
  4. Kelas TestSynchronizedBlock2: Ini adalah kelas utama. Di dalamnya, kita membuat objek Sender dan dua objek SenderWThreads yang masing-masing akan mengirim pesan berbeda.
  5. Memulai dan Menunggu Utas: Kode di bagian bawah program memulai kedua utas dan kemudian menunggu hingga keduanya selesai dengan sender1.join() dan sender2.join(). Ini memastikan bahwa kita menunggu kedua utas selesai sebelum program berakhir.

    Ketika menjalankan program ini, Anda akan melihat bahwa dua utas mengirim pesan secara bersamaan, tetapi hanya satu utas yang dapat mengirim pesan pada satu waktu, karena kita menggunakan blok sinkronisasi dengan objek Sender. Hal ini memastikan bahwa pesan-pesan tersebut tidak tercampur dan dikirim dengan benar secara bergantian.



       
    
        

Komentar