JavaRush /Java Blogu /Random-AZ /Mövzu sinxronizasiyası. Java-da sinxronlaşdırılmış operat...

Mövzu sinxronizasiyası. Java-da sinxronlaşdırılmış operator

Qrupda dərc edilmişdir
Salam! Bu gün biz çox yivli proqramlaşdırmanın xüsusiyyətlərini nəzərdən keçirməyə və ip sinxronizasiyası haqqında danışmağa davam edəcəyik.
Mövzu sinxronizasiyası.  Operator sinxronlaşdırıldı - 1
"Sinxronizasiya" nədir? Proqramlaşdırma sahəsindən kənarda, bu, iki cihazın və ya proqramın birlikdə işləməsinə imkan verən bir növ quraşdırmaya aiddir. Məsələn, smartfon və kompüter Google hesabı ilə, veb-saytdakı şəxsi hesab isə sosial şəbəkələrdəki hesablarla sinxronlaşdırıla bilər ki, onlardan istifadə etməklə daxil olmaq üçün. Mövzu sinxronizasiyasının oxşar mənası var: iplərin bir-biri ilə qarşılıqlı əlaqəsini qurmaqdır. Əvvəlki mühazirələrdə iplərimiz bir-birindən ayrı yaşayır və işləyirdi. Biri nəyisə sayırdı, ikincisi yatırdı, üçüncüsü konsolda nəyisə göstərirdi, amma bir-biri ilə əlaqə qurmadılar. Real proqramlarda belə hallar nadirdir. Bir neçə mövzu aktiv şəkildə işləyə bilər, məsələn, eyni məlumat dəsti ilə və içindəki bir şeyi dəyişdirə bilər. Bu problemlər yaradır. Təsəvvür edin ki, bir neçə başlıq mətn faylı və ya konsol kimi eyni yerə mətn yazır. Bu halda bu fayl və ya konsol paylaşılan mənbəyə çevrilir. Mövzular bir-birinin varlığından xəbərsizdir, ona görə də onlar sadəcə olaraq mövzu planlayıcısının onlara ayırdığı vaxt ərzində idarə edə bildikləri hər şeyi yazır. Kursun bu yaxınlarda verdiyi mühazirədə bunun nəyə gətirib çıxaracağına dair bir nümunə əldə etdik, gəlin bunu xatırlayaq: Mövzu sinxronizasiyası.  Sinxronlaşdırılmış operator - 2Səbəb iplərin bir-biri ilə hərəkətləri əlaqələndirmədən ortaq bir resursla, konsolla işləməsindədir. Mövzu planlayıcısı Thread-1-ə vaxt ayırıbsa, o, dərhal hər şeyi konsola yazır. Başqa mövzuların artıq yaza bildiyi və ya yaza bilmədiyi vacib deyil. Nəticə, gördüyünüz kimi, fəlakətlidir. Buna görə də, çox yivli proqramlaşdırmada xüsusi bir mutex konsepsiyası təqdim edildi (ingilis dilindən "mutex", "qarşılıqlı istisna" - "qarşılıqlı istisna") . Muteksin məqsədi müəyyən bir zamanda obyektə yalnız bir ipin daxil olması üçün mexanizm təmin etməkdir. Əgər Thread-1 A obyektinin mutexini əldə edibsə, onda başqa mövzuların heç nəyi dəyişmək üçün ona girişi olmayacaq. A obyektinin mutexi buraxılana qədər, qalan iplər gözləmək məcburiyyətində qalacaqlar. Real həyat nümunəsi: Təsəvvür edin ki, siz və 10 başqa tanımadığınız şəxs təlimdə iştirak edirsiniz. Növbə ilə fikir bildirmək və nəyisə müzakirə etmək lazımdır. Ancaq bir-birinizi ilk dəfə gördüyünüzə görə, daim bir-birinizin sözünü kəsməmək və küpə düşməmək üçün "danışan top" qaydasından istifadə edirsiniz: yalnız bir nəfər danışa bilər - topu əlində olan adam. onun əlləri. Beləliklə, müzakirə adekvat və səmərəli olur. Deməli, mutex, mahiyyətcə, belə bir topdur. Əgər obyektin mutexi bir ipin əlindədirsə, digər mövzular obyektə daxil ola bilməyəcək. Muteks yaratmaq üçün heç bir şey etməyə ehtiyac yoxdur: o, artıq sinifdə qurulub Object, yəni Java-da hər bir obyektdə var.

Sinxronlaşdırılmış operator Java-da necə işləyir

Gəlin yeni açar sözlə tanış olaq - sinxronizasiya . Bu kodun müəyyən bir hissəsini qeyd edir. Əgər kod bloku sinxronlaşdırılmış açar sözlə işarələnibsə, bu o deməkdir ki, blok eyni anda yalnız bir başlıq tərəfindən icra edilə bilər. Sinxronizasiya müxtəlif yollarla həyata keçirilə bilər. Məsələn, bütün sinxronlaşdırılmış metod yaradın:
public synchronized void doSomething() {

   //...method logic
}
Və ya hansısa obyektdə sinxronizasiyanın aparıldığı kod blokunu yazın:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...some logic available to all threads

       synchronized (obj) {

           //logic that is only available to one thread at a time
       }
   }
}
Mənası sadədir. Sinxronlaşdırılmış sözlə işarələnmiş kod blokuna bir başlıq daxil olarsa, o, dərhal obyektin mutexini əldə edir və eyni bloka və ya metoda daxil olmağa çalışan bütün digər mövzular əvvəlki ip öz işini tamamlayana qədər gözləmək məcburiyyətində qalırlar. ekran. Mövzu sinxronizasiyası.  Sinxronlaşdırılmış operator - 3Yeri gəlmişkən! Kurs mühazirələrində siz artıq sinxronlaşdırılmış nümunələri görmüsünüz, lakin onlar fərqli görünürdülər:
public void swap()
{
   synchronized (this)
   {
       //...method logic
   }
}
Mövzu sizin üçün yenidir və təbii ki, əvvəlcə sintaksislə qarışıqlıq olacaq. Buna görə də, sonradan yazı üsullarında çaşqınlıq yaratmamaq üçün dərhal xatırlayın. Bu iki yazı metodu eyni şeyi ifadə edir:
public void swap() {

   synchronized (this)
   {
       //...method logic
   }
}


public synchronized void swap() {

   }
}
Birinci halda, metoda daxil olduqdan dərhal sonra sinxronlaşdırılmış kod bloku yaradırsınız. thisO, obyekt tərəfindən , yəni cari obyekt tərəfindən sinxronlaşdırılır . İkinci misalda isə bütün metoda sinxronlaşdırılmış söz qoyursunuz. Sinxronizasiyanın həyata keçirildiyi hər hansı obyekti açıq şəkildə göstərməyə artıq ehtiyac yoxdur. Bütün metod sözlə işarələndikdən sonra bu metod avtomatik olaraq sinifin bütün obyektləri üçün sinxronlaşdırılacaq. Hansı metodun daha yaxşı olduğunu müzakirə etməyək. Hələlik daha çox bəyəndiyinizi seçin :) Əsas odur ki, yadda saxlamaq lazımdır: metodu yalnız onun daxilindəki bütün məntiq eyni anda bir iplə yerinə yetirildikdə sinxronizasiya elan edə bilərsiniz. Məsələn, bu halda doSomething()metodu sinxronizasiya etmək səhv olardı:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...some logic available to all threads

       synchronized (obj) {

           //logic that is only available to one thread at a time
       }
   }
}
Gördüyünüz kimi, metodun bir hissəsi sinxronizasiya tələb olunmayan məntiqi ehtiva edir. İçindəki kod eyni vaxtda bir neçə ip tərəfindən icra edilə bilər və bütün kritik yerlər ayrıca sinxronlaşdırılmış bloka ayrılmışdır. Və bir an. Adların mübadiləsi ilə mühazirədən nümunəmizə mikroskop altında baxaq:
public void swap()
{
   synchronized (this)
   {
       //...method logic
   }
}
Xahiş edirik unutmayın: sinxronizasiya istifadə edərək həyata keçirilir this. Yəni müəyyən bir obyekt üçün MyClass. Təsəvvür edin ki, bizdə 2 mövzu ( Thread-1Thread-2) və yalnız bir obyekt var MyClass myClass. Bu halda, Thread-1metod çağırılırsa myClass.swap(), obyektin mutexi məşğul olacaq və Thread-2siz onu çağırmağa çalışdığınız zaman myClass.swap()o, mutexin azad olmasını gözləyəcək. MyClassFərqli obyektlərdə 2 mövzu və myClass12 obyektimiz varsa myClass2, mövzularımız eyni vaxtda sinxronlaşdırılmış metodları asanlıqla yerinə yetirə bilər. Birinci başlıq belə edir:
myClass1.swap();
İkincisi edir:
myClass2.swap();
Bu halda, metod daxilində sinxronlaşdırılmış açar söz swap()proqramın işinə təsir etməyəcək, çünki sinxronizasiya müəyyən bir obyektdə aparılır. Sonuncu halda isə 2 obyektimiz var.Ona görə də iplər bir-birinə problem yaratmır. Axı iki obyektin 2 fərqli mutexesi var və onların tutulması bir-birindən asılı deyil.

Statik metodlarda sinxronizasiyanın xüsusiyyətləri

Bəs statik metodu sinxronizasiya etmək lazımdırsa nə etməli?
class MyClass {
   private static String name1 = "Olya";
   private static String name2 = "Lena";

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

}
Bu halda mutex kimi nəyin xidmət edəcəyi bəlli deyil. Axı biz artıq qərar vermişik ki, hər bir obyektin mutexi var. Ancaq problem ondadır ki, statik metodu çağırmaq üçün MyClass.swap()bizə obyektlər lazım deyil: metod statikdir! Beləliklə, növbəti nədir? :/ Əslində bunda heç bir problem yoxdur. Java yaradıcıları hər şeyin öhdəsindən gəldi :) Əgər kritik “çox axınlı” məntiqi ehtiva edən metod statikdirsə, sinxronizasiya sinif tərəfindən həyata keçiriləcək. Daha aydınlıq üçün yuxarıdakı kodu belə yenidən yazmaq olar:
class MyClass {
   private static String name1 = "Olya";
   private static String name2 = "Lena";

   public static void swap() {

       synchronized (MyClass.class) {
           String s = name1;
           name1 = name2;
           name2 = s;
       }
   }

}
Prinsipcə, bu barədə özünüz düşünə bilərdiniz: obyektlər olmadığı üçün sinxronizasiya mexanizmi birtəhər siniflərin özlərinə "bağlanmalıdır". Bu belədir: siz həmçinin siniflər arasında sinxronizasiya edə bilərsiniz.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION