JavaRush /Java блогу /Random-KY /Жипти синхрондоштуруу, объектти кулпулоо жана классты кул...
CynepHy6
Деңгээл
Великий Новгород

Жипти синхрондоштуруу, объектти кулпулоо жана классты кулпулоо

Группада жарыяланган
Жипти синхрондоштуруу, an objectти кулпулоо жана классты кулпулоо - 1Синхрондоштуруу көп агымды билдирет. Коддун синхрондоштурулган блогу бир эле учурда бир жип тарабынан аткарылышы мүмкүн. Java аткаруу үчүн бир нече жиптерди колдойт. Бул эки же андан көп жиптердин бир талаага же an objectке кирүүсүнө алып келиши мүмкүн. Синхрондоштуруу - бул программадагы бардык параллелдүү жиптердин синхрондуу иштешине мүмкүндүк берүүчү процесс. Синхрондоштуруу жалпы эстутумга ыраатсыз жетүүдөн улам келип чыккан эстутум ырааттуулугунун каталарынан сактайт. Метод синхрондоштурулган деп жарыяланганда, жип методу аткарылып жаткан an object үчүн мониторду кармап турат. Эгерде башка жип синхрондоштурулган ыкманы аткарып жатса, сиздин жип башка жип мониторду бошотмоюнча бөгөттөлөт. Синхрондоштуруу 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
        }
    }
}

Класс деңгээлиндеги кулпу

Класстын жеткorктүү инстанцияларында аткаруу учурунда бир нече жиптердин синхрондоштурулган блокко киришине жол бербейт. Бул программаны аткаруу учурунда класстын 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