3.1 Objek aktif
Objek Aktif ialah corak reka bentuk yang memisahkan benang pelaksanaan kaedah daripada benang di mana ia dipanggil. Tujuan corak ini adalah untuk menyediakan pelaksanaan selari menggunakan panggilan kaedah tak segerak dan penjadual pemprosesan permintaan.
Versi ringkas:
![objek aktif](https://cdn.codegym.cc/images/article/19841270-318f-4d3e-ad78-23c7e8acf225/800.jpeg)
Varian klasik:
![Objek aktif 2](https://cdn.codegym.cc/images/article/db9858eb-5021-40ae-a561-9989b344f1fd/800.jpeg)
Templat ini mempunyai enam elemen:
- Objek proksi yang menyediakan antara muka kepada kaedah awam pelanggan.
- Antara muka yang mentakrifkan kaedah capaian untuk objek aktif.
- Senarai permintaan masuk daripada pelanggan.
- Penjadual yang menentukan susunan pertanyaan yang akan dilaksanakan.
- Pelaksanaan kaedah objek aktif.
- Prosedur panggil balik atau pembolehubah untuk klien menerima hasil.
3.2 kunci
Corak Kunci ialah mekanisme penyegerakan yang membenarkan akses eksklusif kepada sumber yang dikongsi antara berbilang utas. Kunci adalah salah satu cara untuk menguatkuasakan dasar kawalan serentak.
![](https://cdn.codegym.cc/images/article/c1de466a-7e83-4372-a79e-7344cbe094f8/800.jpeg)
Pada asasnya, kunci lembut digunakan, dengan andaian bahawa setiap utas cuba "memperoleh kunci" sebelum mengakses sumber kongsi yang sepadan.
Walau bagaimanapun, sesetengah sistem menyediakan mekanisme penguncian mandatori yang mana percubaan capaian tanpa kebenaran kepada sumber terkunci akan dibatalkan dengan membuang pengecualian pada utas yang cuba mendapatkan akses.
Semaphore ialah jenis kunci yang paling mudah. Dari segi akses data, tiada perbezaan dibuat antara mod akses: dikongsi (baca sahaja) atau eksklusif (baca-tulis). Dalam mod kongsi, berbilang utas boleh meminta kunci untuk mengakses data dalam mod baca sahaja. Mod akses eksklusif juga digunakan dalam kemas kini dan padam algoritma.
![corak kunci](https://cdn.codegym.cc/images/article/14da5562-e2ce-49f4-b330-3312f977f4b4/800.jpeg)
Jenis kunci dibezakan oleh strategi menyekat kesinambungan pelaksanaan benang. Dalam kebanyakan pelaksanaan, permintaan untuk kunci menghalang urutan daripada terus dilaksanakan sehingga sumber terkunci tersedia.
Kunci spin ialah kunci yang menunggu dalam gelung sehingga akses diberikan. Kunci sedemikian sangat cekap jika benang menunggu kunci untuk masa yang singkat, dengan itu mengelakkan penjadualan semula benang yang berlebihan. Kos menunggu akses akan menjadi ketara jika salah satu benang memegang kunci untuk masa yang lama.
![corak kunci 2](https://cdn.codegym.cc/images/article/8c7fe29c-5d7b-4888-9745-b45fbe9a0424/800.jpeg)
Untuk melaksanakan mekanisme penguncian dengan berkesan, sokongan pada peringkat perkakasan diperlukan. Sokongan perkakasan boleh dilaksanakan sebagai satu atau lebih operasi atom seperti "uji-dan-set", "ambil-dan-tambah" atau "bandingkan-dan-tukar". Arahan sedemikian membolehkan anda menyemak tanpa gangguan bahawa kunci itu percuma, dan jika ya, kemudian dapatkan kunci itu.
3.3 Memantau
Corak Monitor ialah interaksi proses peringkat tinggi dan mekanisme penyegerakan yang menyediakan akses kepada sumber yang dikongsi. Pendekatan untuk menyegerakkan dua atau lebih tugas komputer menggunakan sumber biasa, biasanya perkakasan atau set pembolehubah.
Dalam multitugas berasaskan monitor, pengkompil atau jurubahasa secara telus memasukkan kod kunci buka kunci ke dalam rutin yang diformatkan dengan betul, secara telus kepada pengaturcara, menyelamatkan pengaturcara daripada memanggil primitif penyegerakan secara eksplisit.
![](https://cdn.codegym.cc/images/article/3b7a2de5-610e-43da-9752-9ae8fa604eb8/800.jpeg)
Monitor terdiri daripada:
- satu set prosedur yang berinteraksi dengan sumber yang dikongsi
- mutex
- pembolehubah yang berkaitan dengan sumber ini
- invarian yang mentakrifkan keadaan untuk mengelakkan keadaan perlumbaan
Prosedur monitor memperoleh mutex sebelum memulakan kerja dan menahannya sama ada sehingga prosedur keluar atau sehingga keadaan tertentu menunggu. Jika setiap prosedur menjamin bahawa invarian adalah benar sebelum mengeluarkan mutex, maka tiada tugas boleh memperoleh sumber dalam keadaan perlumbaan.
Beginilah cara pengendali disegerakkan berfungsi di Jawa dengan kaedah wait()
dan notify()
.
3.4 Periksa semula penguncian
Penguncian yang disemak dua kali ialah corak reka bentuk selari yang bertujuan untuk mengurangkan overhed mendapatkan kunci.
Pertama, keadaan menyekat diperiksa tanpa sebarang penyegerakan. Benang cuba memperoleh kunci hanya jika hasil semakan menunjukkan bahawa ia perlu memperoleh kunci itu.
//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 untuk mencipta objek tunggal dalam persekitaran selamat benang?
public static Singleton getInstance() {
if (instance == null)
instance = new Singleton();
}
Jika anda mencipta objek Singleton daripada benang yang berbeza, maka mungkin terdapat situasi di mana beberapa objek dicipta pada masa yang sama, dan ini tidak boleh diterima. Oleh itu, adalah munasabah untuk membungkus penciptaan objek dalam pernyataan yang disegerakkan.
public static Singleton getInstance() {
synchronized (Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
Pendekatan ini akan berfungsi, tetapi ia mempunyai kelemahan kecil. Selepas objek dibuat, setiap kali anda cuba mendapatkannya pada masa hadapan, semakan akan dilakukan dalam blok yang disegerakkan, yang bermaksud bahawa benang semasa dan semua yang berkaitan dengannya akan dikunci. Jadi kod ini boleh dioptimumkan sedikit:
public static Singleton getInstance() {
if (instance != null)
return instance;
synchronized (Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
Pada sesetengah bahasa dan/atau pada sesetengah mesin adalah tidak mungkin untuk melaksanakan corak ini dengan selamat. Oleh itu, ia kadang-kadang dipanggil anti-corak. Ciri sedemikian telah membawa kepada kemunculan hubungan tertib ketat "berlaku sebelum ini" dalam Model Memori Java dan Model Memori C++.
Ia biasanya digunakan untuk mengurangkan overhed melaksanakan pengamulaan malas dalam program berbilang benang, seperti corak reka bentuk Singleton. Dalam permulaan malas pembolehubah, pemulaan ditangguhkan sehingga nilai pembolehubah diperlukan dalam pengiraan.
3.5 Penjadual
Penjadual ialah corak reka bentuk selari yang menyediakan mekanisme untuk melaksanakan dasar penjadualan, tetapi bebas daripada mana-mana dasar tertentu. Mengawal susunan urutan urutan harus melaksanakan kod berjujukan, menggunakan objek yang secara eksplisit menentukan urutan urutan menunggu.
![](https://cdn.codegym.cc/images/article/6cf63a65-1fe5-44f8-a43c-6f5219728c9a/800.jpeg)