3.1 Objek aktif
Obyek aktif minangka pola desain sing misahake utas eksekusi metode saka benang sing diarani. Tujuan saka pola iki yaiku kanggo nyedhiyakake eksekusi paralel nggunakake panggilan metode asinkron lan penjadwal pangolahan panjaluk.
Versi prasaja:
Varian klasik:
Cithakan iki nduweni enem unsur:
- Obyek proxy sing nyedhiyakake antarmuka kanggo metode umum klien.
- Antarmuka sing nemtokake cara akses kanggo obyek aktif.
- Dhaptar panjalukan sing mlebu saka klien.
- Penjadwal sing nemtokake urutan pitakon sing bakal ditindakake.
- Implementasi metode obyek aktif.
- Prosedur callback utawa variabel kanggo klien nampa asil.
3.2 ngunci
Pola Kunci minangka mekanisme sinkronisasi sing ngidini akses eksklusif menyang sumber daya sing dienggo bareng antarane pirang-pirang utas. Kunci minangka salah sawijining cara kanggo ngetrapake kabijakan kontrol konkurensi.
Sejatine, kunci alus digunakake, kanthi asumsi yen saben thread nyoba "entuk kunci" sadurunge ngakses sumber daya sing cocog.
Nanging, sawetara sistem nyedhiyakake mekanisme ngunci wajib sing nyoba akses ora sah menyang sumber sing dikunci bakal dibatalake kanthi mbuwang pangecualian ing utas sing nyoba entuk akses.
Semaphore minangka jinis kunci sing paling gampang. Ing babagan akses data, ora ana bedane antarane mode akses: bareng (maca-mung) utawa eksklusif (maca-nulis). Ing mode sing dienggo bareng, sawetara utas bisa njaluk kunci kanggo ngakses data ing mode mung diwaca. Mode akses eksklusif uga digunakake ing algoritma nganyari lan mbusak.
Jinis kunci dibedakake kanthi strategi mblokir kelanjutan eksekusi benang. Ing paling implementasine, panjalukan kanggo kunci ngalangi thread saka terus kanggo eksekusi nganti sumber dikunci kasedhiya.
A spinlock minangka kunci sing ngenteni ing daur ulang nganti akses diwenehake. Kunci kasebut efisien banget yen benang ngenteni kunci kanggo sawetara wektu, saéngga ngindhari jadwal ulang benang sing berlebihan. Biaya nunggu akses bakal pinunjul yen salah siji saka Utas nyekeli kunci kanggo dangu.
Kanggo ngleksanakake mekanisme ngunci kanthi efektif, dhukungan ing tingkat hardware dibutuhake. Dhukungan hardware bisa ditindakake minangka siji utawa luwih operasi atom kayata "test-and-set", "fetch-and-add" utawa "compare-and-swap". Instruksi kasebut ngidini sampeyan mriksa tanpa gangguan yen kunci gratis, lan yen mangkono, banjur entuk kunci kasebut.
3.3 Monitor
Pola Monitor minangka mekanisme interaksi lan sinkronisasi proses tingkat dhuwur sing nyedhiyakake akses menyang sumber daya sing dienggo bareng. Pendekatan kanggo nyinkronake loro utawa luwih tugas komputer nggunakake sumber daya umum, biasane hardware utawa sakumpulan variabel.
Ing multitasking adhedhasar monitor, kompiler utawa juru basa kanthi transparan nglebokake kode kunci-kunci menyang rutinitas sing diformat kanthi bener, kanthi transparan menyang programmer, ngirit programmer saka kanthi jelas nelpon sinkronisasi primitif.
Monitor kalebu:
- kumpulan tata cara sing sesambungan karo sumber daya bareng
- mutex
- variabel sing digandhengake karo sumber iki
- invarian sing nemtokake kahanan kanggo nyegah kondisi balapan
Prosedur monitor entuk mutex sadurunge miwiti karya lan nahan nganti prosedur metu utawa nganti kondisi tartamtu dienteni. Yen saben prosedur njamin yen invarian bener sadurunge ngeculake mutex, mula ora ana tugas sing bisa entuk sumber daya ing kondisi balapan.
Mangkene carane operator sing disinkronake ing Jawa nganggo metode wait()
lan notify()
.
3.4 Priksa kaping pindho ngunci
Kunci sing dicenthang kaping pindho minangka pola desain paralel sing dimaksudake kanggo nyuda overhead kanggo entuk kunci.
Kaping pisanan, kondisi pamblokiran dicenthang tanpa sinkronisasi. Utas nyoba ndarbeni kunci mung yen asil mriksa nuduhake yen kudu entuk kunci kasebut.
//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(); //
}
}
}
}
Kepiye carane nggawe obyek tunggal ing lingkungan sing aman?
public static Singleton getInstance() {
if (instance == null)
instance = new Singleton();
}
Yen sampeyan nggawe obyek Singleton saka benang sing beda-beda, bisa uga ana kahanan ing ngendi sawetara obyek digawe bebarengan, lan iki ora bisa ditampa. Mulane, cukup kanggo mbungkus nggawe obyek ing statement sing disinkronake.
public static Singleton getInstance() {
synchronized (Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
Pendekatan iki bakal bisa digunakake, nanging nduweni kekurangan cilik. Sawise obyek digawe, saben-saben sampeyan nyoba kanggo njaluk ing mangsa, mriksa bakal dileksanakake ing pamblokiran diselarasake, kang tegese thread saiki lan kabeh sing disambungake karo bakal dikunci. Dadi kode iki bisa dioptimalake rada:
public static Singleton getInstance() {
if (instance != null)
return instance;
synchronized (Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
Ing sawetara basa lan / utawa ing sawetara mesin, pola iki ora bisa ditindakake kanthi aman. Mulane, kadhangkala disebut anti-pola. fitur kuwi wis mimpin kanggo katon saka "kedadeyan sadurunge" sesambetan urutan ketat ing Jawa Memori Model lan C ++ Model memori.
Biasane digunakake kanggo nyuda overhead ngleksanakake initialization males ing program multi-threaded, kayata pola desain Singleton. Ing initialization malas variabel, initialization ditundha nganti nilai variabel dibutuhake ing komputasi.
3.5 Penjadwal
Penjadwal minangka pola desain paralel sing nyedhiyakake mekanisme kanggo ngetrapake kabijakan penjadwalan, nanging ora gumantung saka kabijakan tartamtu. Ngontrol urutan thread kudu nglakokake kode sekuensial, nggunakake obyek sing kanthi jelas nemtokake urutan thread tunggu.
GO TO FULL VERSION