JavaRush /Блоги Java /Random-TG /Синхронизатсияи ришта, қулфи объект ва қулфи синф
CynepHy6
Сатҳи
Великий Новгород

Синхронизатсияи ришта, қулфи объект ва қулфи синф

Дар гурӯҳ нашр шудааст
Синхронизатсияи ришта, қулфи an object ва қулфи синф - 1Синхронизатсия ба чанд ришта дахл дорад. Блоки ҳамоҳангшудаи code метавонад дар як вақт танҳо аз ҷониби як ришта иҷро карда шавад. Java риштаҳои сершуморро барои иҷро дастгирӣ мекунад. Ин метавонад боиси он гардад, ки ду ё зиёда риштаҳо ба як майдон ё an object дастрасӣ пайдо кунанд. Синхронизатсия равандест, ки ба ҳама риштаҳои параллелӣ дар барнома имкон медиҳад, ки синхронӣ кор кунанд. Синхронизатсия аз хатогиҳои мутобиқати хотира, ки дар натиҷаи дастрасии номувофиқ ба хотираи муштарак ба вуҷуд омадааст, пешгирӣ мекунад. Вақте ки усул ҳамчун ҳамоҳангшуда эълон карда мешавад, ришта мониторро барои an objectе нигоҳ медорад, ки методаш иҷро мешавад. Агар риштаи дигар усули ҳамоҳангшударо иҷро кунад, риштаи шумо то он даме, ки риштаи дигар мониторро озод кунад, баста мешавад. Синхронизатсия дар Java бо истифода аз калимаи ҳифзшуда ба даст оварда мешавад synchronized. Шумо метавонед онро дар синфҳои худ тавассути муайян кардани усулҳо ё блокҳои ҳамоҳангшуда истифода баред. Шумо наметавонед synchronizedдар тағирёбандаҳо ё атрибутҳо дар таърифи синф истифода баред.

Қулфбандии сатҳи an object

Ин як механизми ҳамоҳангсозии усули ғайристатикӣ ё блоки ғайристатикии 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. когда Howой либо поток входит в синхронизированный метод or блок он приобретает блокировку и всякий раз, когда поток выходит из синхронизированного метода or блока JVM снимает блокировку. Блокировка снимается, даже если нить оставляет синхронизированный метод после завершения из-за Howих-либо ошибок or исключений.

  4. synchronized в Java рентерабельна это означает, что если синхронизированный метод вызывает другой синхронизированный метод, который требует такой же замок, то текущий поток, который держит замок может войти в этот метод не приобретая замок.

  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