"Halo, Amigo! Kita duwe panacea - tamba kanggo kabeh penyakit. Kaya sing wis kita deleng, ngoper benang sing ora bisa dikontrol minangka masalah."

"Yagene benang ora bisa mutusake kapan kudu ngalih menyang thread sabanjure? Apa kabeh sing kudu ditindakake banjur menehi tandha, "Aku wis rampung!"

"Ngidini Utas dhewe kanggo ngontrol ngoper bakal dadi masalah malah luwih gedhe. Upaminipun sampeyan duwe sawetara kode kurang ditulis, lan thread tau nyerah CPU. Mbalik ing dina, iki cara kerjane. Lan iku cukup ngipi elek."

"Oke. Terus piye solusine?"

" Mblokir thread liyane.  Iki cara kerjane."

Dadi cetha yen benang saling ngganggu nalika nyoba nggunakake obyek lan/utawa sumber daya sing dienggo bareng . Kaya sing kita deleng ing conto output konsol: ana siji konsol lan kabeh output benang. Ruwet.

Dadi obyek khusus diciptakake: mutex . Iku kaya tandha ing lawang jedhing sing ngandika «kasedhiya / dikuwasani» . Wis rong negara: obyek kasedhiya utawa dikuwasani . Negara-negara kasebut uga disebut "dikunci" lan "dikunci".

Nalika utas mbutuhake obyek sing dienggo bareng karo utas liyane, dheweke bakal mriksa mutex sing ana gandhengane karo obyek kasebut. Yen mutex ora dikunci, benang kasebut ngunci (tandhani minangka «dikuwasani») lan wiwit nggunakake sumber daya sing dienggo bareng. Sawise utas wis rampung, mutex ora dikunci (ditandhani minangka «kasedhiya»).

Yen benang pengin nggunakake obyek kasebut lan mutex dikunci, banjur benang turu nalika ngenteni. Nalika mutex pungkasane ora dikunci dening benang sing manggoni, benang kita bakal langsung ngunci lan wiwit mlaku. Analogi karo tandha lawang jedhing sampurna.

"Dadi carane aku bisa karo mutex? Apa aku kudu nggawe obyek khusus?"

"Iku luwih prasaja saka iku. Pencipta Jawa nggawe mutex iki menyang kelas Obyek. Dadi sampeyan ora kudu nggawe. Iku bagean saka saben obyek. Mangkene carane kabeh bisa digunakake: "

Kode Katrangan
class MyClass
{
private String name1 = "Ally";
private String name2 = "Lena";

public void swap()
{
synchronized (this)
{
String s = name1;
name1 = name2;
name2 = s;
}
}
}
Metode swap ngganti nilai variabel name1 lan name2.

Apa sing bisa kedadeyan yen diarani saka rong utas bebarengan?

Eksekusi kode nyata Kode utas pisanan Kode utas kapindho
String s1 = name1; //Ally
name1 = name2; //Lena
name2 = s1; //Ally

String s2 = name1; //Lena
name1 = name2; //Ally
name2 = s2; //Lena
String s1 = name1;
name1 = name2;
//other thread is running
name2 = s1;
//the thread waits until the mutex is unlocked

String s2 = name1;
name1 = name2;
//other thread is running
//other thread is running
name2 = s2;
Garis ngisor
Nilai saka variabel diganti kaping pindho, bali menyang panggonan asline.

Pay manungsa waé menyang tembung kunci  sing disinkronake .

"Iya, apa tegese?"

"Nalika thread mlebu blok kode sing ditandhani minangka disinkronake, mesin Java langsung ngunci mutex obyek sing dituduhake ing tanda kurung sawise tembung sing disinkronake. Ora ana thread liyane sing bisa mlebu blok iki nganti thread kita ninggalake. Sanalika thread kita metu . blok sing ditandhani disinkronake, mutex bakal langsung dikunci lan bakal kasedhiya kanggo dituku dening benang liyane."

Yen mutex dikuwasani, benang kita bakal mandheg lan ngenteni kanggo mbebasake.

"Dadi prasaja lan elegan. Iku solusi sing apik."

"Iya. Nanging apa sampeyan mikir bakal kelakon ing kasus iki?"

Kode Katrangan
class MyClass
{
private String name1 = "Ally";
private String name2 = "Lena";

public void swap()
{
synchronized (this)
{
String s = name1;
name1 = name2;
name2 = s;
}
}

public void swap2()
{
synchronized (this)
{
String s = name1;
name1 = name2;
name2 = s;
}
}
}
Cara swap lan swap2 nuduhake mutex sing padha ( obyek iki ).

Apa sing kedadeyan yen siji thread nelpon metode swap lan thread liyane nelpon metode swap2?

"Amarga mutex padha, utas kapindho kudu ngenteni nganti utas pisanan ninggalake blok sing disinkronake. Dadi ora bakal ana masalah karo akses simultan."

"Inggih, Amigo! Kuwi jawaban sing bener!"

Saiki aku pengin nuduhake manawa sinkronisasi bisa digunakake kanggo menehi tandha ora mung blok kode, nanging uga metode. Iki tegese:

Kode Apa pancene kedadeyan
class MyClass
{
private static String name1 = "Ally";
private static String name2 = "Lena";

public synchronized void swap()
{
String s = name1;
name1 = name2;
name2 = s;
}

public static synchronized void swap2()
{
String s = name1;
name1 = name2;
name2 = s;
}
}
class MyClass
{
private static String name1 = "Ally";
private static String name2 = "Lena";

public void swap()
{
synchronized (this)
{
String s = name1;
name1 = name2;
name2 = s;
}
}

public static void swap2()
{
synchronized (MyClass.class)
{
String s = name1;
name1 = name2;
name2 = s;
}
}