JavaRush /Java blogi /Random-UZ /Mavzuni sinxronlashtirish, ob'ektni bloklash va sinfni bl...
CynepHy6
Daraja
Великий Новгород

Mavzuni sinxronlashtirish, ob'ektni bloklash va sinfni bloklash

Guruhda nashr etilgan
Mavzuni sinxronlashtirish, ob'ektni bloklash va sinfni blokirovka qilish - 1Sinxronizatsiya ko'p ish zarralarini bildiradi. Sinxronlashtirilgan kod bloki bir vaqtning o'zida faqat bitta ip tomonidan bajarilishi mumkin. Java bajarish uchun bir nechta mavzularni qo'llab-quvvatlaydi. Bu bir xil maydon yoki ob'ektga ikki yoki undan ortiq oqim kirishiga olib kelishi mumkin. Sinxronizatsiya - bu dasturdagi barcha parallel oqimlarning sinxron ishlashiga imkon beruvchi jarayon. Sinxronizatsiya umumiy xotiraga nomuvofiq kirish natijasida kelib chiqqan xotira izchilligidagi xatolardan qochadi. Usul sinxronlashtirilgan deb e'lon qilinganda, ip usuli bajarilayotgan ob'ekt uchun monitorni ushlab turadi. Agar boshqa ish zarrachasi sinxronlashtirilgan usulni bajarayotgan bo'lsa, boshqa ip monitorni qo'yib yubormaguncha sizning ipingiz bloklanadi. Sinxronizatsiya Java'da ajratilgan so'z yordamida amalga oshiriladi synchronized. Sinxronlashtirilgan usullar yoki bloklarni belgilash orqali uni sinflaringizda ishlatishingiz mumkin. synchronizedSiz sinf taʼrifida oʻzgaruvchilar yoki atributlardan foydalana olmaysiz .

Ob'ekt darajasida qulflash

Bu statik bo'lmagan usulni yoki statik bo'lmagan kod blokini sinxronlashtirish mexanizmi bo'lib, faqat bitta ip ma'lum bir sinf misolida berilgan blok yoki usulni bajarishi mumkin. Buni namunaviy darajadagi ma'lumotlar oqimini xavfsiz qilish kerak bo'lganda qilish kerak. Misol:
public class DemoClass{
    public synchronized void demoMethod(){}
}
yoki
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
yoki
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Sinf darajasida qulflash

Sinfning mavjud bo'lgan har qanday misolida bajarilishi davomida sinxronlashtirilgan blokga bir nechta oqimlarning kirishini oldini oladi. Bu shuni anglatadiki, agar dasturni bajarish paytida sinfning 100 ta nusxasi mavjud bo'lsa DemoClass, u holda har qanday holatda o'sha paytda faqat bitta ip bajara oladi demoMethod()va qolgan barcha holatlar boshqa oqimlar uchun bloklanadi. Bu statik ma'lumotlar oqimini xavfsiz qilish kerak bo'lganda kerak.
public class DemoClass{
    public synchronized static void demoMethod(){}
}
yoki
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
yoki
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Ba'zi muhim eslatmalar

  1. Java-da sinxronizatsiya ikkita oqim bir vaqtning o'zida yoki parallel ravishda sinxronlashtirilgan usulni bajara olmasligini ta'minlaydi.

  2. synchronizedfaqat usullar va kod bloklari bilan ishlatilishi mumkin. Ushbu usullar yoki bloklar statik yoki statik bo'lmagan bo'lishi mumkin.

  3. Har qanday ip sinxronlashtirilgan usul yoki blokga kirsa, u qulfga ega bo'ladi va sinxronlashtirilgan usul yoki blokdan chiqqanda JVM qulfni chiqaradi. Har qanday xatolik yoki istisnolar tufayli ish tugagandan so'ng sinxronlashtirilgan usuldan chiqib ketgan taqdirda ham qulf chiqariladi.

  4. synchronizedJava-da , bu shuni anglatadiki, agar sinxronlashtirilgan usul bir xil qulfni talab qiladigan boshqa sinxronlashtirilgan usulni chaqirsa, qulfni ushlab turgan joriy ip qulfni olmagan holda ushbu usulga kirishi mumkin.

  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
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION