JavaRush /Java Blog /Random-TK /Tekstiň sinhronizasiýasy, obýekti gulplamak we synpy gulp...
CynepHy6
Dereje
Великий Новгород

Tekstiň sinhronizasiýasy, obýekti gulplamak we synpy gulplamak

Toparda çap edildi
Tekstiň sinhronizasiýasy, obýekti gulplamak we synpy gulplamak - 1Sinhronizasiýa köp okalmagy aňladýar. Sinhronlaşdyrylan kod bloky diňe bir sapak bilen ýerine ýetirilip bilner. Java ýerine ýetirmek üçin birnäçe sapaklary goldaýar. Bu iki ýa-da has köp sapagyň şol bir meýdana ýa-da obýekte girmegine sebäp bolup biler. Sinhronizasiýa, programmadaky ähli parallel sapaklaryň sinhron işlemegine mümkinçilik berýän prosesdir. Sinhronizasiýa, umumy ýadyň gabat gelmezligi sebäpli ýüze çykýan ýadyň yzygiderliliginden gaça durýar. Haçan-da bir usul sinhronlaşdyrylan diýlip yglan edilende, sapak ýerine ýetirilýän obýekt üçin monitor saklaýar. Başga bir sapak sinhronlaşdyrylan usuly ýerine ýetirýän bolsa, beýleki sapak monitory goýberýänçä, sapagyňyz petiklener. Sinhronizasiýa Java-da ätiýaçlandyrylan söz ulanyp gazanylýar synchronized. Sinhronlaşdyrylan usullary ýa-da bloklary kesgitläp, sapaklaryňyzda ulanyp bilersiňiz. synchronizedSynp kesgitlemesinde üýtgeýänlerde ýa-da atributlarda ulanyp bilmersiňiz .

Obýekt derejesindäki gulplama

Bu, statik däl usuly ýa-da statik däl kod blokyny sinhronlamak üçin bir mehanizm, synpyň belli bir mysalynda diňe bir sapak berlen blok ýa-da usuly ýerine ýetirip biler. Mysal derejesindäki maglumat sapagyny ygtybarly etmek zerur bolanda bu edilmelidir. Mysal:
public class DemoClass{
    public synchronized void demoMethod(){}
}
ýa-da
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
ýa-da
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Klassiki derejeli gulplama

Synpyň bar bolan ýagdaýlarynda ýerine ýetirilende birnäçe sapaklaryň sinhron bloklara girmeginiň öňüni alýar. Diýmek, programma ýerine ýetirilende synpyň 100 mysaly bar bolsa DemoClass, şol döwürde diňe bir sapak islendik ýagdaýda ýerine ýetirip biler demoMethod()we beýleki ähli ýagdaýlar beýleki sapaklar üçin petiklener. Statiki maglumatlar sapagyny ygtybarly etmek zerur bolsa.
public class DemoClass{
    public synchronized static void demoMethod(){}
}
ýa-da
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
ýa-da
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Käbir möhüm bellikler

  1. Java-da sinhronizasiýa, iki sapagyň bir wagtda ýa-da paralel sinhronlaşdyrylan usuly ýerine ýetirip bilmejekdigini üpjün edýär.

  2. synchronizeddiňe usullar we kod bloklary bilen ulanylyp bilner. Bu usullar ýa-da bloklar statik ýa-da statik däl bolup biler.

  3. Haçan-da haýsydyr bir sapak sinhronlaşdyrylan usula gireninde ýa-da blokirläninde gulp alýar we haçan-da bir sapak sinhronlaşdyrylan usuldan çyksa ýa-da JVM blokirlese gulpy boşadýar. Haýsydyr bir ýalňyşlyk ýa-da kadadan çykma sebäpli sapak gutarandan soň sinhronlaşdyrylan usuldan çyksa-da gulp boşadylýar.

  4. synchronizedJava-da , bu sinhronlaşdyrylan usul şol bir gulpy talap edýän başga bir sinhronlaşdyrylan usuly çagyrsa, gulpy saklaýan häzirki sapak gulpy almazdan şol usula girip biljekdigini aňladýar.

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