CodeGym /Java Course /Modul 3 /Pola Multithreaded

Pola Multithreaded

Modul 3
Level 17 , Pelajaran 2
Tersedia

3.1 Objek aktif

Objek Aktif adalah pola desain yang memisahkan utas eksekusi suatu metode dari utas yang memanggilnya. Tujuan dari pola ini adalah untuk menyediakan eksekusi paralel menggunakan pemanggilan metode asinkron dan penjadwal pemrosesan permintaan.

Versi sederhana:

objek aktif

Varian klasik:

Objek aktif 2

Template ini memiliki enam elemen:

  • Objek proxy yang menyediakan antarmuka ke metode publik klien.
  • Antarmuka yang menentukan metode akses untuk objek aktif.
  • Daftar permintaan masuk dari klien.
  • Penjadwal yang menentukan urutan kueri yang akan dieksekusi.
  • Implementasi metode objek aktif.
  • Prosedur callback atau variabel untuk klien untuk menerima hasil.

3.2 kunci

Pola Kunci adalah mekanisme sinkronisasi yang memungkinkan akses eksklusif ke sumber daya bersama di antara banyak utas. Kunci adalah salah satu cara untuk menerapkan kebijakan kontrol konkurensi.

Pada dasarnya, kunci lunak digunakan, dengan asumsi bahwa setiap utas mencoba untuk "mendapatkan kunci" sebelum mengakses sumber daya bersama yang sesuai.

Namun, beberapa sistem menyediakan mekanisme penguncian wajib di mana upaya akses tidak sah ke sumber daya yang dikunci akan dibatalkan dengan memberikan pengecualian pada utas yang mencoba mendapatkan akses.

Semafor adalah jenis kunci yang paling sederhana. Dalam hal akses data, tidak ada perbedaan yang dibuat antara mode akses: bersama (hanya baca) atau eksklusif (baca-tulis). Dalam mode bersama, banyak utas dapat meminta kunci untuk mengakses data dalam mode hanya baca. Mode akses eksklusif juga digunakan dalam memperbarui dan menghapus algoritma.

pola kunci

Jenis-jenis kunci dibedakan dengan strategi memblokir kelanjutan eksekusi utas. Di sebagian besar implementasi, permintaan untuk kunci mencegah utas terus dieksekusi hingga sumber daya yang dikunci tersedia.

Spinlock adalah kunci yang menunggu dalam satu lingkaran hingga akses diberikan. Kunci seperti itu sangat efisien jika utas menunggu kunci untuk waktu yang singkat, sehingga menghindari penjadwalan ulang utas yang berlebihan. Biaya menunggu akses akan signifikan jika salah satu utas menahan kunci untuk waktu yang lama.

pola kunci 2

Untuk menerapkan mekanisme penguncian secara efektif, diperlukan dukungan di tingkat perangkat keras. Dukungan perangkat keras dapat diimplementasikan sebagai satu atau lebih operasi atomik seperti "test-and-set", "fetch-and-add" atau "compare-and-swap". Instruksi semacam itu memungkinkan Anda untuk memeriksa tanpa gangguan bahwa kuncinya bebas, dan jika demikian, dapatkan kuncinya.

3.3 Memantau

Pola Monitor adalah interaksi proses tingkat tinggi dan mekanisme sinkronisasi yang menyediakan akses ke sumber daya bersama. Suatu pendekatan untuk menyinkronkan dua atau lebih tugas komputer menggunakan sumber daya umum, biasanya perangkat keras atau serangkaian variabel.

Dalam multitasking berbasis monitor, kompiler atau juru bahasa secara transparan menyisipkan kode kunci-buka kunci ke dalam rutinitas yang diformat dengan tepat, secara transparan kepada pemrogram, menyelamatkan pemrogram dari memanggil primitif sinkronisasi secara eksplisit.

Monitornya terdiri dari:

  • satu set prosedur yang berinteraksi dengan sumber daya bersama
  • mutex
  • variabel yang terkait dengan sumber daya ini
  • invarian yang mendefinisikan kondisi untuk menghindari kondisi balapan

Prosedur monitor memperoleh mutex sebelum mulai bekerja dan menahannya sampai prosedur keluar atau sampai kondisi tertentu menunggu. Jika setiap prosedur menjamin bahwa invarian benar sebelum melepaskan mutex, maka tidak ada tugas yang dapat memperoleh sumber daya dalam kondisi balapan.

Beginilah cara kerja operator tersinkronisasi di Jawa dengan metode wait()and notify().

3.4 Periksa ulang penguncian

Penguncian ganda diperiksa adalah pola desain paralel yang dimaksudkan untuk mengurangi overhead mendapatkan kunci.

Pertama, kondisi pemblokiran diperiksa tanpa sinkronisasi apa pun. Utas mencoba mendapatkan kunci hanya jika hasil pemeriksaan menunjukkan bahwa ia perlu mendapatkan kunci.

//Double-Checked Locking
public final class Singleton {
private static Singleton instance; //Don't forget volatile modifier

public static Singleton getInstance() {
     if (instance == null) {                //Read

         synchronized (Singleton.class) {    //
             if (instance == null) {         //Read Write
                 instance = new Singleton(); //
             }
         }
     }
 }

Bagaimana cara membuat objek tunggal di lingkungan yang aman untuk thread?

public static Singleton getInstance() {
   if (instance == null)
    instance = new Singleton();
}

Jika Anda membuat objek Singleton dari utas yang berbeda, mungkin ada situasi di mana beberapa objek dibuat secara bersamaan, dan ini tidak dapat diterima. Oleh karena itu, masuk akal untuk membungkus pembuatan objek dalam pernyataan yang disinkronkan.

public static Singleton getInstance() {
    synchronized (Singleton.class) {
        if (instance == null)
        instance = new Singleton();
    }
}

Pendekatan ini akan berhasil, tetapi memiliki kelemahan kecil. Setelah objek dibuat, setiap kali Anda mencoba mendapatkannya di masa mendatang, pemeriksaan akan dilakukan di blok yang disinkronkan, yang berarti utas saat ini dan semua yang terhubung dengannya akan dikunci. Jadi kode ini bisa sedikit dioptimalkan:

public static Singleton getInstance() {
     if (instance != null)
        return instance;

    synchronized (Singleton.class) {
        if (instance == null)
        instance = new Singleton();
    }
}

Pada beberapa bahasa dan/atau pada beberapa mesin tidak mungkin menerapkan pola ini dengan aman. Oleh karena itu, terkadang disebut anti-pola. Fitur-fitur tersebut telah menyebabkan munculnya hubungan urutan ketat "terjadi sebelum" dalam Model Memori Java dan Model Memori C++.

Ini biasanya digunakan untuk mengurangi biaya penerapan inisialisasi malas dalam program multi-utas, seperti pola desain Singleton. Dalam inisialisasi lambat suatu variabel, inisialisasi ditunda hingga nilai variabel diperlukan dalam perhitungan.

3.5 Penjadwal

Penjadwal adalah pola desain paralel yang menyediakan mekanisme untuk mengimplementasikan kebijakan penjadwalan, tetapi tidak bergantung pada kebijakan tertentu. Mengontrol urutan di mana utas harus mengeksekusi kode sekuensial, menggunakan objek yang secara eksplisit menentukan urutan utas yang menunggu.

Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION