Modul A

 Laporan Sistem Operasi


Modul A



Disusun Oleh :

Riska Haqika Situmorang
2208107010086








 

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





  1. Understanding the problem without Synchronization

         -TestSynchronization1.java



  • class Table  Ini adalah deklarasi kelas Table.
  • private char currentChar = 'a' Ini adalah variabel anggota kelas Table yang menyimpan karakter saat ini yang akan dicetak. Nilainya diinisialisasi dengan 'a'.
  • void printAlphabets(char startChar, char endChar) Ini adalah metode dalam kelas Table yang digunakan untuk mencetak huruf-huruf dalam rentang tertentu. Metode ini menerima dua parameter, yaitu startChar (karakter awal) dan endChar (karakter akhir).
  • for (char c = startChar; c <= endChar; c++)  Ini adalah loop for yang akan berjalan dari startChar hingga endChar untuk mencetak huruf-huruf dalam rentang yang ditentukan.
  • System.out.println(currentChar) Ini mencetak karakter saat ini, yaitu currentChar, ke layar.
  • Selanjutnya, ada blok kondisional if yang memeriksa apakah currentChar kurang dari 'z'. Jika benar, maka currentChar ditingkatkan untuk mencetak huruf berikutnya dalam urutan abjad. Jika currentChar sudah mencapai 'z', maka currentChar direset ke 'a' untuk mengulang urutan abjad.
  • try { Thread.sleep(400); } catch (InterruptedException e) { System.out.println(e);  Ini adalah blok try-catch yang menangani pengecualian jika terjadi gangguan saat tidur (sleep). Dalam hal ini, setiap thread akan tidur selama 400 milidetik setiap kali selesai mencetak karakter saat ini.



  • class MyThread1 extends Thread  Ini adalah deklarasi kelas MyThread1, yang merupakan subclass dari Thread. Thread ini akan digunakan untuk mencetak huruf-huruf dari 'a' hingga 'm'.
  • class MyThread2 extends Thread  Ini adalah deklarasi kelas MyThread2, yang juga merupakan subclass dari Thread. Thread ini akan digunakan untuk mencetak huruf-huruf dari 'n' hingga 'z'.                                                   

  • public class TestSynchronization1  Ini adalah deklarasi kelas utama.
  • public static void main(String args[])  Ini adalah metode utama yang akan dieksekusi saat program dimulai.
  • Table obj = new Table(); Membuat objek dari kelas Table dengan nama obj.
  • MyThread1 t1 = new MyThread1(obj); Membuat objek t1 dari kelas MyThread1 dan melewatkan objek obj sebagai parameter constructor.
  • MyThread2 t2 = new MyThread2(obj); Membuat objek t2 dari kelas MyThread2 dan melewatkan objek obj sebagai parameter constructor.
  • t1.start();: Memulai eksekusi thread t1 dengan memanggil metode start(), yang pada gilirannya akan menjalankan metode run() di dalam MyThread1.
  • t2.start();: Memulai eksekusi thread t2 dengan memanggil metode start(), yang pada gilirannya akan menjalankan metode run() di dalam MyThread2.

Dengan menggunakan dua thread yang berbeda, program ini mencetak huruf-huruf dalam dua rentang yang berbeda secara bersamaan. Namun, perlu dicatat bahwa tidak ada sinkronisasi yang diterapkan dalam kode ini, sehingga hasil cetakan dapat berubah-ubah antara eksekusi yang berbeda.


Output :

Output dari kode diatas adalah bahwa dua thread, MyThread1 dan MyThread2, mencetak huruf-huruf dalam dua rentang yang berbeda secara bersamaan, tetapi tanpa sinkronisasi. Sebagai hasilnya,  terlihat output yang tidak teratur dan huruf-huruf dari kedua rentang dapat saling bercampur. Ini terjadi karena kedua thread dapat mengakses dan memodifikasi variabel currentChar secara bersamaan tanpa koordinasi yang tepat. Jadi, urutan cetakan huruf-huruf dalam rentang 'a' hingga 'm' dan 'n' hingga 'z' mungkin tidak selalu berurutan atau konsisten, dan hasilnya mungkin berbeda setiap kali program dijalankan.


2.    Java Synchronized Method

     -TestSynchronization2.java

  • private int currentChar = 97;  Ini adalah variabel anggota kelas Table yang menyimpan nilai ASCII karakter saat ini (dalam kasus ini, 97 adalah kode ASCII untuk 'a').
  • synchronized void printAlphabets(int startChar, int endChar)  Ini adalah metode dalam kelas Table yang digunakan untuk mencetak huruf-huruf dalam rentang tertentu. Metode ini diberi kata kunci synchronized, yang mengunci objek t ketika metode ini dieksekusi, memastikan bahwa hanya satu thread dapat menjalankannya pada suatu waktu.
  • for (int i = startChar; i <= endChar; i++)  Ini adalah loop for yang akan berjalan dari startChar hingga endChar untuk mencetak huruf-huruf dalam rentang yang ditentukan.
  • System.out.println((char) currentChar); Ini mencetak karakter saat ini (diubah dari nilai ASCII currentChar menjadi karakter) ke layar.
  • currentChar++; Menambahkan nilai currentChar sehingga thread selanjutnya akan mencetak karakter berikutnya.
  • if (currentChar > 122) { currentChar = 97; } Jika currentChar melebihi kode ASCII untuk 'z' (122), maka currentChar direset ke kode ASCII untuk 'a' (97), sehingga siklus huruf berulang.
  • try { Thread.sleep(400); } catch (InterruptedException e) { System.out.println(e); } Ini adalah blok try-catch yang menangani pengecualian jika terjadi gangguan saat tidur (sleep). Dalam hal ini, setiap thread akan tidur selama 400 milidetik setelah mencetak karakter saat ini.

  • class MyThread1 extends Thread  Ini adalah deklarasi kelas MyThread1, yang merupakan subclass dari Thread. Thread ini akan digunakan untuk mencetak huruf-huruf dari 'a' hingga 'm'.
  • class MyThread2 extends Thread  Ini adalah deklarasi kelas MyThread2, yang juga merupakan subclass dari Thread. Thread ini akan digunakan untuk mencetak huruf-huruf dari 'n' hingga 'z'.         
                         
  • public class TestSynchronization2 {: Ini adalah deklarasi kelas utama.
  • public static void main(String args[]) {: Ini adalah metode utama yang akan dieksekusi saat program dimulai.
  • Table obj = a Table();: Membuat objek dari kelas Table dengan nama obj.
  • MyThread1 t1 = new MyThread1(obj);: Membuat objek t1 dari kelas MyThread1 dan melewatkan objek obj sebagai parameter constructor.
  • MyThread2 t2 = new MyThread2(obj);: Membuat objek t2 dari kelas MyThread2 dan melewatkan objek obj sebagai parameter constructor.
  • t1.start();: Memulai eksekusi thread t1 dengan memanggil metode start(), yang pada gilirannya akan menjalankan metode run() di dalam MyThread1.
  • t2.start();: Memulai eksekusi thread t2 dengan memanggil metode start(), yang pada gilirannya akan menjalankan metode run() di dalam MyThread2.

Karena metode printAlphabets diberi kata kunci synchronized, kedua thread akan secara bergantian mengakses metode ini, sehingga hasil cetakannya akan berurutan dan tidak terjadi interupsi antara kedua thread.

Output :


        Output diatas adalah menunjukkan bahwa dua thread, MyThread1 dan MyThread2, mencetak huruf-huruf dalam dua rentang yang berbeda secara bersamaan dengan sinkronisasi. Karena metode printAlphabets diberi kata kunci synchronized, hanya satu thread yang dapat mengakses metode ini pada satu waktu. Sebagai hasilnya, huruf-huruf dalam rentang 'a' hingga 'm' ('a' sampai 'm') dicetak oleh thread pertama, dan huruf-huruf dalam rentang 'n' hingga 'z' ('n' sampai 'z') dicetak oleh thread kedua. Karena ada sinkronisasi, urutan cetakan huruf-huruf dalam kedua rentang tersebut akan berurutan dan konsisten, sehingga hasil cetakannya akan selalu mengikuti urutan 'a' sampai 'm' oleh thread 1, dan kemudian 'n' sampai 'z' oleh thread 2.


LAMPIRAN :

 -TestSynchronization1.java

//method not synchronized  
class Table {
    private char currentChar = 'a';

    // Method untuk mencetak huruf-huruf dalam rentang tertentu
    void printAlphabets(char startChar, char endChar) {
        for (char c = startChar; c <= endChar; c++) {
            System.out.println(currentChar); // Mencetak currentChar

            // Memperbarui currentChar agar thread berikutnya tahu huruf mana yang akan dicetak selanjutnya
            if (currentChar < 'z') {
                currentChar = (char) (currentChar + 1);
            } else {
                currentChar = 'a';
            }

            try {
                Thread.sleep(400);
            } catch (InterruptedException e) {
                System.out.println(e);
            }
        }
    }
}

class MyThread1 extends Thread {
    Table t;

    MyThread1(Table t) {
        this.t = t;
    }

    public void run() {
        // Thread 1 mencetak huruf dari 'a' hingga 'm'
        t.printAlphabets('a', 'm');
    }
}

class MyThread2 extends Thread {
    Table t;

    MyThread2(Table t) {
        this.t = t;
    }

    public void run() {
        // Thread 2 mencetak huruf dari 'n' hingga 'z'
        t.printAlphabets('n', 'z');
    }
}

public class TestSynchronization1 {
    public static void main(String args[]) {
        Table obj = new Table();
        MyThread1 t1 = new MyThread1(obj);
        MyThread2 t2 = new MyThread2(obj);
        t1.start();
        t2.start();
    }
}



 -TestSynchronization2.java

//example of java synchronized method  
class Table {
    private int currentChar = 97; // ASCII code for 'a'

    synchronized void printAlphabets(int startChar, int endChar) {
        for (int i = startChar; i <= endChar; i++) {
            System.out.println((char) currentChar);
            currentChar++;

            if (currentChar > 122) {
                currentChar = 97; // Reset to 'a' when 'z' is reached
            }

            try {
                Thread.sleep(400);
            } catch (InterruptedException e) {
                System.out.println(e);
            }
        }
    }
}

class MyThread1 extends Thread {
    Table t;

    MyThread1(Table t) {
        this.t = t;
    }

    public void run() {
        t.printAlphabets(97, 109); // 'm' - 'a' + 1
    }
}

class MyThread2 extends Thread {
    Table t;

    MyThread2(Table t) {
        this.t = t;
    }

    public void run() {
        t.printAlphabets(110, 122); // 'z' - 'n' + 1
    }
}

public class TestSynchronization21 {
    public static void main(String args[]) {
        Table obj = new Table();
        MyThread1 t1 = new MyThread1(obj);
        MyThread2 t2 = new MyThread2(obj);
        t1.start();
        t2.start();
    }
}


Komentar