JavaRush /Kurslar /All lectures for TK purposes /Ne garaşsyz ýipler! Synchyronized gerek!

Ne garaşsyz ýipler! Synchyronized gerek!

All lectures for TK purposes
Dereje , Sapak
Elýeterli

— Salam, Amigo! Bizde ähli meseläni çözýän derman bar. Biz eýýäm synag etdik – garaşsyz ýagdaýda ýipleriň geçişi – bu bir mesele.

— Näme üçin ýipler öz başlaryna kararyp, haçan geçmelidigine karar bermänoklar? Ähli möhüm işleri ýerine ýetirip, "Bolýar" diýip bilýärler!

— Ýiplere öz geçişlerini dolandyrmaga rugsat bermek – has uly mesele. Birden bir kod gowşak ýazylsa we ýip öz "prosessoryň wagtyny" hiç haçan daşyna çykarmaz. Öňler şeýle bolupdy – we bu bir sessiz gorky.

— Bolýar. We näme çözgüt bar?

Ýipleriň blokirlenmesi. Ine, nähili işleýär.

Anyklanyldy, ýipler biri-birine päsgel berýär, umumy obýektler we/ýa-da resurslar bilen işleşýänlerinde. Konsolda çykarmak mysarynda bolşy ýaly: konsol bir, hemme ýipler oňa ýazýarlar. Bu bir tertipsizlik.

Şonuň üçin ýörite obýekt – mutex oýlanyp tapyldy. Bu hajathanyň gapysynda "boş" we "meşgul" diýen tapgyç ýaly. Iki ýagdaýy bar – obýekt boş we obýekt meşgul, ýa-da olaryň başgaça atlandyrylşy blokirlenen we blokirlenmedik.

Haçan-da bir ýipiň hemmeler üçin umumy bolan bir obýekte ýa-da resurslara mätäçligi ýüze çykanda, ol bu obýekt bilen bagly mutex-i gözden geçirýär. Eger mutex boş bolsa, onda ýip ony blokirleýär (meşgul edip belleýär) we umumy resursy ulanmaga başlaýar. Işlerini bitirdikden soň, mutex blokirlenmeýär (boş edip bellener).

Ýöne, ýip obýekti ulanmak isleýär, emma mutex blokirlenen bolsa, onda ýip garaşmak üçin uklap galýar. Ahyrynda, mutex iş ýerini azat edende, biziň ýipimiz derrew ony blokirleýär we işine başlaýar. Tamamlanan hajathana üçin tapgyç analoýasy bilen bir.

— Bu mutex bilen nähili işleşmeli? Ýörite obýektleri döretmeli mi?

— Hemmesi has ýönekeý. Java-nyň işläp düzüjileri bu mutex-i Object klassyna birikdirdiler. Saňa ony döretmegiň geregi ýok. Her bir obýektdä bar. Ine, nähili işleýär:

Kod Düşündiriş
class MyClass
{
private String name1 = "Oля";
private String name2 = "Лена";

public void swap()
{
synchronized (this)
{
String s = name1;
name1 = name2;
name2 = s;
}
}
}
swap metody name1 & name2 üýtgedýän.

Eger iki ýip bilen bir wagtda çagyrsaň näme bolar?

Netije tertibi Birinji ýip kody Ikinji ýip kody
String s1 = name1; //Oля
name1 = name2; //Лена
name2 = s1; //Oля

String s2 = name1; //Лена
name1 = name2; //Oля
name2 = s2; //Лена
String s1 = name1; name1 = name2;
name2 = s1;
//başga ýip işlenýär
//başga ýip işlenýär
//başga ýip işlenýär
//ýip mutex açylýança garaşýar
//ýip mutex açylýança garaşýar
//ýip mutex açylýança garaşýar
String s2 = name1; name1 = name2;
name2 = s2;
Netije
Dürli ýerlerde iki gezek üýtgedilip, başdaky ýerine getirilýär.

Synchronized açary sözine üns beriň.

— Hawa, bu näme diýmek?

— Haçan bir ýip synchronized diýlen kodyň içine girse, Java maşyn derrew obýektiň mutexini blokirleýär, bu sözden soň töweregiň içinde görkezilen. Başga ýip bu bloga girip bilmez, ta ki biziň ýibimiz çykýança. Haçan biziň ýibimiz blogdan çykarsa, mutex awtomatiki blokirlenmeýär we başga ýipler üçin açylýar.

Eger mutex meşgul bolsa, onda biziň ýibimiz ýolda durup garaşjak.

— Şeýlebir ýönekeý we owadan çözgüt. Gözellik!

— Howwa. Şu ýagdaýda näme bolar diýip pikir edýän?

Kod Düşündiriş
class MyClass
{
private String name1 = "Оля";
private String name2 = "Лена";

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

public void swap2()
{
synchronized (this)
{
String s = name1;
name1 = name2;
name2 = s;
}
}
}
swap we swap2 metodlarynyň mutexi bir – obýekt this.

Eger bir ýip swap metody çagyrsa, başga biri bolsa swap2 çagyrsa näme bolar?

— Çünki olaryň bir mutexi bar, beýleki ýip synchronized blogyndan çykýança garaşmaly boljak, şol sebäpden bilelikde kullanmakda mesele ýok.

— Aferin, Amigo! Dogry çözgüt!

Siziň ünsümi çekmek isleýärin, synchronized sözi bir bölek kody we bir metody belläp biler. Ine, bu näme diýmek:

Kod Aslynda näme bolup geçýär
class MyClass
{
private static String name1 = "Оля";
private static String name2 = "Лена";

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 = "Оля";
private static String name2 = "Лена";

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;
}
}
}
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION