"Halo, Amigo!"

"Halo, Ellie!"

"Aku arep ngomong babagan modifier molah malih. Apa sampeyan ngerti apa iku?"

"Ana apa karo benang. Aku ora ngelingi persis."

"Banjur ngrungokake. Iki sawetara rincian teknis kanggo sampeyan:"

"Komputer nduweni rong jinis memori: memori global (biasa) lan memori sing dibangun ing prosesor. Memori prosesor sing dibangun dipérang dadi register, cache tingkat pertama (L1), cache tingkat kapindho (L2), lan tingkat katelu (L3).

"Jinis memori iki nduweni kecepatan sing beda-beda. Memori paling cepet lan paling cilik yaiku register, banjur cache prosesor (L1, L2, L3), lan pungkasane memori global (paling alon)."

"Memori global lan cache prosesor operate ing kacepetan wildly beda, supaya mesin Java ngidini saben thread kanggo nyimpen variabel sing paling kerep digunakake ing memori thread lokal (ing cache prosesor)."

"Apa proses iki bisa dikontrol?"

"Ora tenan. Kabeh karya wis rampung dening mesin Java. Iku banget cerdas nalika nerangake ngoptimalake kinerja."

"Nanging kene kok aku pitutur marang kowe iki. Ana siji masalah cilik. Nalika loro Utas digunakake karo variabel padha, saben siji bisa nyimpen salinan ing cache lokal dhewe. Banjur siji thread bisa ngganti variabel, nanging kaloro bisa uga ora weruh owah-owahan, amarga isih bisa digunakake karo salinan variabel dhewe."

"Inggih, apa sing bisa ditindakake?"

"Pencipta Jawa nyedhiyakake tembung kunci khusus kanggo kahanan iki: molah malih. Yen variabel diakses saka benang sing beda-beda, sampeyan kudu menehi tandha karo modifier molah malih, supaya mesin Java ora dilebokake ing cache. Iki biasane katon:"

public volatile int count = 0;

"Oh, aku kelingan. Sampeyan wis ngomong iki. Aku wis ngerti iki."

"Ya mesthi. Nanging sampeyan mung ngelingi nalika dakkandhani."

"Eh, aku rada lali."

"Ambalan minangka ibu sinau!"

"Iki sawetara fakta anyar babagan modifier molah malih. Modifier molah malih mung njamin yen variabel bakal diwaca lan ditulis kanthi aman. Ora njamin yen bakal diganti kanthi aman."

"Apa bedane?"

"Deleng carane variabel diganti:"

Kode Apa sing sejatine kedadeyan: Katrangan
count++
register = count;

register = register+1;

count = register;
langkah 1.
Nilai count variabel disalin saka memori global menyang ndhaftar prosesor.

Langkah 2.
Ing prosesor, variabel register ditambah 1.

Langkah 3.
Nilai saka variabel disalin saka prosesor kanggo memori global.

"Wah! Dadi, kabeh variabel diganti mung ing prosesor?"

"Ya wis."

"Lan angka disalin bali lan kasebut: saka memori kanggo prosesor lan bali?"

"Ya wis."

"Modifikator molah malih njamin yen count variabel diakses bakal diwaca saka memori (langkah 1). Lan yen thread pengin nemtokake nilai anyar, mesthi bakal ana ing memori global (langkah 3)."

"Nanging mesin Java ora njamin yen ora ana benang sing ngalih ing antarane langkah 1 lan 3."

"Dadi, nambah variabel kanthi 1 sejatine telung operasi?"

"Ya."

"Lan yen loro utas bebarengan pengin nglakokaké count ++, banjur padha bisa ngganggu siji liyane?"

"Ya, priksa:"

Utas 1 Utas 2 asil
register1 = count;
register1++;
count = register1;
register2 = count;
register2++;
count = register2;
register1 = count;
register2 = count;
register2++;
count = register2;
register1++;
count = register1;

"Dadi, sampeyan bisa ngakses variabel, nanging ngganti isih beboyo?"

"Wah iso ganti, ati-ati wae ☺"

"Piye?"

" Sinkronisasi  iku kanca paling apik kita."

"Aku weruh."