JavaRush /Blog Java /Random-MS /Penyegerakan benang, penguncian objek dan penguncian kela...
CynepHy6
Tahap
Великий Новгород

Penyegerakan benang, penguncian objek dan penguncian kelas

Diterbitkan dalam kumpulan
Penyegerakan benang, penguncian objek dan penguncian kelas - 1Penyegerakan merujuk kepada multithreading. Blok kod yang disegerakkan hanya boleh dilaksanakan oleh satu utas pada satu masa. Java menyokong berbilang benang untuk pelaksanaan. Ini boleh menyebabkan dua atau lebih utas mengakses medan atau objek yang sama. Penyegerakan ialah proses yang membenarkan semua utas selari dalam atur cara berjalan serentak. Penyegerakan mengelakkan ralat konsistensi memori yang disebabkan oleh akses yang tidak konsisten kepada memori yang dikongsi. Apabila kaedah diisytiharkan sebagai disegerakkan, benang memegang monitor untuk objek yang kaedahnya sedang dilaksanakan. Jika utas lain sedang melaksanakan kaedah yang disegerakkan, utas anda akan disekat sehingga utas lain melepaskan monitor. Penyegerakan dicapai dalam Java menggunakan perkataan terpelihara synchronized. Anda boleh menggunakannya dalam kelas anda dengan menentukan kaedah atau blok yang disegerakkan. Anda tidak akan dapat menggunakan synchronizeddalam pembolehubah atau atribut dalam definisi kelas.

Penguncian peringkat objek

Ini ialah mekanisme untuk menyegerakkan kaedah bukan statik atau blok bukan statik kod supaya hanya satu utas boleh melaksanakan blok atau kaedah tertentu pada contoh kelas tertentu. Ini harus dilakukan pada bila-bila masa anda perlu memastikan urutan data peringkat contoh selamat. Contoh:
public class DemoClass{
    public synchronized void demoMethod(){}
}
atau
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
atau
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Penguncian peringkat kelas

Menghalang berbilang benang daripada memasuki blok yang disegerakkan semasa pelaksanaan dalam mana-mana kejadian kelas yang tersedia. Ini bermakna jika terdapat 100 kejadian kelas semasa pelaksanaan program DemoClass, maka hanya satu utas pada masa itu akan dapat melaksanakan demoMethod()dalam mana-mana kes, dan semua kes lain akan disekat untuk utas lain. Ini perlu apabila anda perlu membuat benang data statik selamat.
public class DemoClass{
    public synchronized static void demoMethod(){}
}
atau
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
atau
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Beberapa Nota Penting

  1. Penyegerakan dalam Java memastikan bahawa tiada dua utas boleh melaksanakan kaedah yang disegerakkan pada masa yang sama atau selari.

  2. synchronizedhanya boleh digunakan dengan kaedah dan blok kod. Kaedah atau blok ini boleh menjadi statik atau tidak statik.

  3. Apabila mana-mana benang memasuki kaedah disegerakkan atau menyekat ia memperoleh kunci dan apabila benang keluar dari kaedah disegerakkan atau menyekat JVM melepaskan kunci. Kunci dilepaskan walaupun benang meninggalkan kaedah yang disegerakkan selepas selesai kerana sebarang ralat atau pengecualian.

  4. synchronizeddalam Java , ini bermakna jika kaedah disegerakkan memanggil kaedah disegerakkan lain yang memerlukan kunci yang sama, benang semasa yang memegang kunci boleh memasuki kaedah itu tanpa memperoleh kunci.

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