JavaRush /Блоги Java /Random-TG /Синхронизатсияи ришта. Оператори ҳамоҳангшуда дар Java

Синхронизатсияи ришта. Оператори ҳамоҳангшуда дар Java

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо баррасии хусусиятҳои барномасозии бисёрсоҳаро идома медиҳем ва дар бораи синхронизатсияи ришта сӯҳбат мекунем.
Синхронизатсияи ришта.  Оператор ҳамоҳангшуда - 1
"Synchronization" чист? Берун аз доираи барномасозӣ, ин ба як намуди танзимот дахл дорад, ки ба ду дастгоҳ ё барнома имкон медиҳад, ки якҷоя кор кунанд. Масалан, смартфон ва компютерро бо ҳисоби Google ҳамоҳанг кардан мумкин аст ва ҳисоби шахсии вебсайт метавонад бо ҳисобҳо дар шабакаҳои иҷтимоӣ ҳамоҳанг карда шавад, то бо истифода аз онҳо ворид шавед. Синхронизатсияи ришта маънои якхела дорад: он танзим кардани он аст, ки чӣ гуна риштаҳо бо ҳамдигар ҳамкорӣ мекунанд. Дар лекцияхои пештара риштахои мо аз хамдигар алохида зиндагй ва кор мекарданд. Яке чизеро ҳисоб мекард, дуюмӣ хоб буд, сеюмӣ чизеро дар консол нишон медод, аммо онҳо бо ҳамдигар муносибат намекарданд. Дар барномаҳои воқеӣ чунин ҳолатҳо хеле каманд. Якчанд риштаҳо метавонанд фаъолона кор кунанд, масалан, бо як маҷмӯи маълумот ва чизеро дар он иваз кунанд. Ин мушкилот эҷод мекунад. Тасаввур кунед, ки риштаҳои сершумор матнро ба як макон, ба монанди файли матнӣ ё консол менависанд. Ин файл ё консол дар ин ҳолат ба манбаи муштарак табдил меёбад. Риштаҳо дар бораи мавҷудияти якдигар намедонанд, аз ин рӯ онҳо танҳо ҳама чизеро, ки метавонанд идора кунанд, дар вақте, ки банақшагирии ришта ба онҳо ҷудо мекунад, менависанд. Дар лексияи охирини курс, мо як мисоле доштем, ки ин ба чӣ оварда мерасонад, биёед дар хотир дорем: Синхронизатсияи ришта.  Оператори ҳамоҳангшуда - 2Сабаб дар он аст, ки риштаҳо бо як манбаи муштарак, консол бидуни ҳамоҳангсозии амалҳо бо ҳамдигар кор мекарданд. Агар ҷадвалбандии ришта ба Thread-1 вақт ҷудо карда бошад, он фавран ҳама чизро ба консол менависад. Кадом риштаҳои дигар аллакай тавонистаанд навиштан ё навиштан муяссар нашуд, муҳим нест. Оқибат, чунон ки шумо мебинед, фалокатовар аст. Аз ин рӯ, дар барномасозии бисёр ришта консепсияи махсуси мутекс ҷорӣ карда шуд (аз инглисӣ “mutex”, “mutual exclusion” - “mutual exclusion”) . Мақсади мутекс таъмин кардани механизмест, ки танҳо як ришта ба an object дар вақти муайян дастрасӣ дошта бошад. Агар Thread-1 мутекси an objectи А-ро ба даст оварда бошад, риштаҳои дигар ба он дастрасӣ надоранд, то чизе дар он тағир диҳанд. То он даме, ки мутекси an objectи А озод карда нашавад, риштаҳои боқимонда маҷбур мешаванд, ки интизор шаванд. Мисоли воқеии ҳаёт: тасаввур кунед, ки шумо ва 10 нафари дигар дар тренинг иштирок мекунед. Ба шумо лозим аст, ки бо навбат фикру ақида баён кунед ва чизеро муҳокима кунед. Аммо, азбаски шумо бори аввал якдигарро мебинед, то пайваста ба якдигар халал нарасонед ва ба ғазаб наафтед, шумо қоидаи "туби гуфтугӯ" -ро истифода мебаред: танҳо як нафар метавонад сухан гӯяд - касе, ки тӯб дорад. дастонаш. Ба хамин тарик мубохиса мувофик ва пурсамар мегардад. Пас, мутекс, аслан, чунин тӯб аст. Агар мутекси an object дар дасти як ришта бошад, риштаҳои дигар наметавонанд ба an object дастрасӣ пайдо кунанд. Барои эҷод кардани мутекс ба шумо ҳеҷ кор кардан лозим нест: он аллакай дар синф сохта шудааст Object, яъне ҳар як an object дар Java онро дорад.

Чӣ тавр оператори ҳамоҳангшуда дар Java кор мекунад

Биёед бо калимаи нави калидӣ шинос шавем - synchronized . Он як қисми муайяни codeи моро қайд мекунад. Агар блоки code бо калимаи калидии ҳамоҳангшуда қайд карда шуда бошад, ин маънои онро дорад, ки блок танҳо аз ҷониби як ришта дар як вақт иҷро карда мешавад. Синхронизатсияро бо роҳҳои гуногун амалӣ кардан мумкин аст. Масалан, як усули синхронӣ эҷод кунед:
public synchronized void doSomething() {

   //...method logic
}
Ё блоки codeро нависед, ки дар он синхронизатсия дар ягон an object амалӣ карда мешавад:
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
       }
   }
}
Маънои он оддӣ аст. Агар як ришта ба блоки codeе ворид шавад, ки бо калимаи ҳамоҳангшуда қайд шудааст, он фавран мутекси an objectро ба даст меорад ва ҳамаи риштаҳои дигар, ки кӯшиши ворид шудан ба як блок ё усулро доранд, маҷбур мешаванд, ки то анҷоми кори риштаи қаблӣ интизор шаванд ва назорат. Синхронизатсияи ришта.  Оператори ҳамоҳангшуда - 3Дар омади гап! Дар лексияҳои курсӣ шумо аллакай мисолҳои синхронизатсияро дидаед, аммо онҳо гуногун буданд:
public void swap()
{
   synchronized (this)
   {
       //...method logic
   }
}
Мавзӯъ барои шумо нав аст ва албатта дар аввал бо синтаксис нофаҳмиҳо мешавад. Аз ин рӯ, фавран ба ёд оред, то дертар дар усулҳои навиштан ошуфта нашавед. Ин ду усули навиштан як чизро доранд:
public void swap() {

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


public synchronized void swap() {

   }
}
Дар ҳолати аввал, шумо фавран пас аз ворид кардани усул блоки ҳамоҳангшудаи codeро эҷод мекунед. thisОн аз ҷониби an object , яъне бо an objectи ҷорӣ ҳамоҳанг карда мешавад . Ва дар мисоли дуюм шумо калимаи ҳамоҳангшударо дар тамоми усул гузоштаед. Дигар зарурати ба таври возеҳ нишон додани ягон an objectе, ки дар он синхронизатсия сурат мегирад, нест. Вақте ки тамоми усул бо калима қайд карда мешавад, ин усул ба таври худкор барои ҳама an objectҳои синф ҳамоҳанг карда мешавад. Биёед ба муҳокимаи он, ки кадом усул беҳтар аст, ғарқ нашавем. Ҳоло он чизеро, ки ба шумо маъқул аст, интихоб кунед :) Муҳим он аст, ки дар хотир дошта бошед: шумо метавонед методро танҳо вақте эълон кунед, ки тамоми мантиқи дохor он аз ҷониби як ришта дар як вақт иҷро карда шавад. Масалан, дар ин ҳолат doSomething()синхронизатсия кардани усул хато хоҳад буд:
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
       }
   }
}
Тавре ки шумо мебинед, як пораи усул дорои мантиқест, ки барои он ҳамоҳангсозӣ лозим нест. Рамзи дар он буда метавонад аз ҷониби якчанд риштаҳо дар як вақт иҷро карда шавад ва ҳама ҷойҳои муҳим ба блоки алоҳидаи ҳамоҳангшуда ҷудо карда мешаванд. Ва як лаҳза. Биёед дар зери микроскоп ба мисоли худ аз лексия бо мубодилаи номҳо назар андозем:
public void swap()
{
   synchronized (this)
   {
       //...method logic
   }
}
Лутфан таваҷҷӯҳ намоед: ҳамоҳангсозӣ бо истифода аз this. Яъне барои an objectи мушаххас MyClass. Тасаввур кунед, ки мо 2 ришта ( Thread-1ва Thread-2) ва танҳо як an object дорем MyClass myClass. Дар ин ҳолат, агар Thread-1усул даъват карда шавад myClass.swap(), мутекси an object банд мешавад ва Thread-2вақте ки шумо ба он занг задан мехоҳед, myClass.swap()он мунтазири озод шудани мутекс овезон мешавад. Агар мо дар an objectҳои гуногун 2 ришта ва 2 an object дошта бошем MyClass, myClass1риштаҳои myClass2мо метавонанд ҳамзамон усулҳои ҳамоҳангшударо ба осонӣ иҷро кунанд. Риштаи аввал чунин мекунад:
myClass1.swap();
Дуюм чунин мекунад:
myClass2.swap();
Дар ин ҳолат, калимаи калидии ҳамоҳангшуда дар дохor усул swap()ба кори барнома таъсир намерасонад, зеро синхронизатсия дар an objectи мушаххас сурат мегирад. Ва дар холати охир мо 2 an object дорем Аз ин ру, риштахо барои хамдигар мушкorе ба вучуд намеоваранд. Охир, ду an object 2 мутекси гуногун доранд ва гирифтани онхо аз хамдигар вобаста нест.

Хусусиятҳои синхронизатсия дар усулҳои статикӣ

Аммо агар ба шумо лозим ояд, ки усули статикиро ҳамоҳанг созед?
class MyClass {
   private static String name1 = "Olya";
   private static String name2 = "Lena";

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

}
Маълум нест, ки дар ин ҳолат чӣ ҳамчун мутекс хидмат хоҳад кард. Охир, мо аллакай карор додем, ки хар як an object мутекс дорад. Аммо мушкилот дар он аст, ки барои даъват кардани усули статикӣ MyClass.swap()ба мо an objectҳо лозим нестанд: усул статикӣ аст! Пас, оянда чӣ аст? :/ Вокеан, дар ин бобат ягон мушкorе нест. Эҷодкорони Java ҳама чизро ғамхорӣ карданд :) Агар усуле, ки мантиқи интиқодии "мултитрид" статикӣ бошад, синхронизатсия аз ҷониби синф анҷом дода мешавад. Барои возеҳи бештар, рамзи дар боло зикршуда метавонад аз нав навишта шавад:
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;
       }
   }

}
Принсип, шумо метавонистед дар ин бора худатон фикр кунед: азбаски an objectҳо вуҷуд надоранд, пас механизми ҳамоҳангсозӣ бояд ба таври дилхоҳ ба худи синфҳо "пайваст карда шавад". Ин чунин аст: шумо инчунин метавонед дар байни синфҳо ҳамоҳанг созед.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION