JavaRush /Blog Jawa /Random-JV /Sinkronisasi benang, ngunci obyek lan ngunci kelas
CynepHy6
tingkat
Великий Новгород

Sinkronisasi benang, ngunci obyek lan ngunci kelas

Diterbitake ing grup
Sinkronisasi utas, ngunci obyek lan ngunci kelas - 1Sinkronisasi nuduhake multithreading. Blok kode sing disinkronake mung bisa dieksekusi dening siji utas sekaligus. Jawa ndhukung sawetara utas kanggo eksekusi. Iki bisa nyebabake loro utawa luwih utas ngakses lapangan utawa obyek sing padha. Sinkronisasi minangka proses sing ngidini kabeh utas paralel ing program bisa mlaku bebarengan. Sinkronisasi ngindhari kesalahan konsistensi memori sing disebabake dening akses sing ora konsisten menyang memori sing dienggo bareng. Nalika cara diumumake minangka disinkronake, benang kasebut ngemot monitor kanggo obyek sing cara dieksekusi. Yen thread liyane nglakokake cara sing disinkronake, thread sampeyan bakal diblokir nganti thread liyane ngeculake monitor. Sinkronisasi digayuh ing basa Jawa nggunakake tembung reserved synchronized. Sampeyan bisa nggunakake ing kelas kanthi nemtokake cara utawa blok sing disinkronake. Sampeyan ora bakal bisa digunakake synchronizeding variabel utawa atribut ing definisi kelas.

Ngunci tingkat obyek

Iki minangka mekanisme kanggo nyinkronake metode non-statis utawa blok kode non-statis, saengga mung siji utas sing bisa nglakokake blok utawa metode tartamtu ing conto kelas tartamtu. Iki kudu ditindakake kapan wae sampeyan kudu nggawe thread data tingkat conto aman. Tuladha:
public class DemoClass{
    public synchronized void demoMethod(){}
}
utawa
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
utawa
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Ngunci tingkat kelas

Ngalangi pirang-pirang utas supaya ora mlebu blok sing disinkronake sajrone eksekusi ing salah sawijining kedadeyan kelas sing kasedhiya. Iki tegese yen ana 100 conto kelas sajrone eksekusi program DemoClass, mung siji utas ing wektu kasebut bakal bisa dieksekusi demoMethod()ing kasus apa wae, lan kabeh kasus liyane bakal diblokir kanggo utas liyane. Iki perlu nalika sampeyan kudu nggawe thread data statis aman.
public class DemoClass{
    public synchronized static void demoMethod(){}
}
utawa
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
utawa
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Sawetara Cathetan Penting

  1. Sinkronisasi ing Jawa mesthekake yen ora ana rong utas sing bisa nglakokake metode sing disinkronake ing wektu sing padha utawa sejajar.

  2. synchronizedmung bisa digunakake karo cara lan pamblokiran kode. Cara utawa blok kasebut bisa statis utawa ora statis.

  3. Yen ana thread sing mlebu ing cara sing disinkronake utawa diblokir, dheweke entuk kunci lan yen ana benang metu saka metode sing disinkronake utawa mblokir JVM ngeculake kunci kasebut. Kunci dibebasake sanajan benang ninggalake cara sing diselarasake sawise rampung amarga ana kesalahan utawa pangecualian.

  4. synchronizeding Jawa , iki tegese yen cara sing diselarasake nelpon cara diselarasake liyane sing mbutuhake kunci padha, thread saiki sing nyekeli kunci bisa ngetik cara sing tanpa ndarbeni 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
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION