JavaRush /Java блогы /Random-KK /Жіпті синхрондау, нысанды құлыптау және сыныпты құлыптау
CynepHy6
Деңгей
Великий Новгород

Жіпті синхрондау, нысанды құлыптау және сыныпты құлыптау

Топта жарияланған
Жіпті синхрондау, нысанды құлыптау және сыныпты құлыптау - 1Синхрондау көп ағынды білдіреді. Синхрондалған code блогын бір уақытта тек бір ағынмен орындауға болады. Java орындау үшін бірнеше ағындарды қолдайды. Бұл екі немесе одан да көп ағындардың бір өріске немесе нысанға қатынасуына әкелуі мүмкін. Синхрондау - бұл бағдарламадағы барлық параллель ағындардың синхронды түрде жұмыс істеуіне мүмкіндік беретін процесс. Синхрондау ортақ жадқа сәйкес келмеу нәтижесінде туындайтын жад тұрақтылығы қателерін болдырмайды. Әдіс синхрондалған деп жарияланған кезде, ағын әдісі орындалатын нысан үшін мониторды ұстайды. Басқа ағын синхрондалған әдісті орындаса, сіздің ағыныңыз басқа ағын мониторды босатқанша блоктайды. Синхрондау Java тілінде сақталған сөздің көмегімен жүзеге асырылады synchronized. Синхрондалған әдістерді немесе блоктарды анықтау арқылы оны сабақтарыңызда пайдалануға болады. synchronizedСіз сынып анықтамасындағы айнымалы мәндерде немесе атрибуттарда пайдалана алмайсыз .

Нысан деңгейіндегі құлыптау

Бұл класстың берілген данасында берілген блокты немесе әдісті тек бір ағын орындай алатындай статикалық емес әдісті немесе статикалық емес code блогын синхрондау механизмі. Мұны дана деңгейіндегі деректер ағынын қауіпсіз ету қажет болған кезде жасау керек. Мысалы:
public class DemoClass{
    public synchronized void demoMethod(){}
}
немесе
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
немесе
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Сынып деңгейіндегі құлыптау

Сыныптың кез келген қолжетімді даналарында орындау кезінде синхрондалған блокқа бірнеше ағындардың кіруіне жол бермейді. Бұл дегеніміз, егер бағдарламаны орындау кезінде сыныптың 100 данасы болса DemoClass, онда кез келген жағдайда сол уақытта тек бір ағын орындай алады demoMethod(), ал қалған барлық жағдайлар басқа ағындар үшін блокталады. Бұл статикалық деректер ағынын қауіпсіз ету қажет болғанда қажет.
public class DemoClass{
    public synchronized static void demoMethod(){}
}
немесе
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
немесе
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Кейбір маңызды ескертпелер

  1. Java-дағы синхрондау екі ағынның бір уақытта немесе параллельді синхрондалған әдісті орындай алмайтынын қамтамасыз етеді.

  2. synchronizedәдістермен және code блоктарымен ғана пайдалануға болады. Бұл әдістер немесе блоктар статикалық немесе статикалық емес болуы мүмкін.

  3. Кез келген ағын синхрондалған әдіске немесе блокқа кірген сайын ол құлыпқа ие болады және ағын синхрондалған әдістен немесе блоктан шыққан сайын JVM құлыпты босатады. Кез келген қателерге немесе ерекше жағдайларға байланысты аяқтағаннан кейін ағын синхрондалған әдістен кетсе де, құлып босатылады.

  4. synchronizedJava-да бұл синхрондалған әдіс бірдей құлыпты қажет ететін басқа үндестірілген әдісті шақырса, құлыпты ұстайтын ағымдағы ағын құлыпты алмай-ақ сол әдіске кіре алатынын білдіреді.

  5. Синхронизация в Java будет бросать NullPointerException если an object используемый в синхронизированном блоке null. Например, в вышеприведенном примере codeа, если замок инициализируется How null, синхронизированный (lock) бросит NullPointerException.

  6. Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего applications. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков codeа для синхронизации только критических секций codeа.

  7. Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно or параллельно, потому что они захватывают замок на другой an object.

  8. В соответствии со спецификацией языка вы не можете использовать synchronized в конструкторе это приведет к ошибке компиляции.

  9. Не синхронизируйте по не финальному (no final) полю, потому что link, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных an objectх и уже не будет ниHowой синхронизации вообще. Лучше всего использовать класс String, который уже неизменяемый и финальный.

Удачи в обучении!! Оригинал: Object level lock vs Class level lock in Java
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION