"Halo, Amigo! Sampeyan elinga yen Ellie ngandhani sampeyan babagan masalah sing muncul nalika sawetara utas nyoba ngakses sumber daya bebarengan, ya?"

"Ya."

"Iku, ora kabeh. Ana masalah cilik liyane."

Kaya sing sampeyan ngerteni, komputer nduweni memori ing ngendi data lan printah (kode) disimpen, uga prosesor sing nindakake printah kasebut lan bisa digunakake karo data kasebut. Prosesor maca data saka memori, ngganti, lan nulis maneh menyang memori. Kanggo nyepetake komputasi, prosesor nduweni memori "cepet" dhewe: cache.

Prosesor mlaku luwih cepet kanthi nyalin variabel lan area memori sing paling kerep digunakake menyang cache. Banjur ndadekake kabeh owah-owahan ing memori cepet iki. Lan banjur nyalin data bali menyang «alon» memori. Kabeh iki, memori alon ngemot variabel lawas (ora owah!).

Iki ngendi masalah muncul. Siji thread ngganti variabel , kayata isCancel utawa isInterrupted ing conto ing ndhuwur, nanging thread kapindho «ora weruh owah-owahan iki , amarga kedadeyan ing memori cepet. Iki minangka akibat saka kasunyatan manawa benang ora duwe akses menyang cache saben liyane. (Prosesor asring ngemot sawetara inti independen lan benang bisa mlaku ing inti sing beda-beda.)

Coba elinga conto wingi:

Kode Katrangan
class Clock implements Runnable
{
private boolean isCancel = false;

public void cancel()
{
this.isCancel = true;
}

public void run()
{
while (!this.isCancel)
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
Utas "ora ngerti" yen benang liyane ana.

Ing cara roto, variabel isCancel dilebokake ing cache thread anak nalika digunakake kanggo pisanan. Operasi iki padha karo kode ing ngisor iki:

public void run()
{
boolean isCancelCached = this.isCancel;
while (!isCancelCached)
{
Thread.sleep(1000);
System.out.println("Tick");
}
}

Nelpon metode mbatalake saka thread liyane bakal ngganti nilai isCancel ing memori normal (alon), nanging ora ing cache thread liyane.

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clock.cancel();
}

"Wah! Lan apa dheweke uga nggawe solusi sing apik kanggo iki, kaya sing  disinkronake ?"

"Sampeyan ora bakal pracaya!"

Pikiran sing sepisanan yaiku mateni cache, nanging iki nggawe program mlaku kaping pirang-pirang luwih alon. Banjur ana solusi sing beda.

Tembung kunci sing molah malih lair. Kita sijine tembung kunci iki sadurunge deklarasi variabel kanggo nunjukake yen nilai kasebut ora kudu dilebokake ing cache. Luwih tepate, ora bisa dilebokake ing cache, nanging mung kudu diwaca lan ditulis ing memori normal (alon).

Mangkene carane ndandani solusi supaya kabeh bisa mlaku:

Kode Katrangan
class Clock implements Runnable
{
private volatile boolean isCancel = false;

public void cancel()
{
this.isCancel = true;
}

public void run()
{
while (!this.isCancel)
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
Modifier molah malih nyebabake variabel tansah diwaca lan ditulis ing memori normal sing dienggo bareng kabeh benang.
public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clock.cancel();
}

"Lha iku?"

"Ya wis. Prasaja lan ayu."