JavaRush /Java Blog /Random-TK /26-njy dereje. Dereje derejesindäki söhbetdeşlik soraglar...
zor07
Dereje
Санкт-Петербург

26-njy dereje. Dereje derejesindäki söhbetdeşlik soraglaryna jogaplar. Bölüm 2. 6-9, 11-12-nji soraglar

Toparda çap edildi
26-njy dereje. Dereje derejesindäki söhbetdeşlik soraglaryna jogaplar.  Bölüm 2. 6-9, 11-12 - 1-nji soraglar

6. Cancarenzi näme?

“Concurrency” Java-da birnäçe sapaklaryň üstünde işlemek üçin optimallaşdyrylan ýörite synplary öz içine alýan synp kitaphanasydyr. Bu sapaklar bukjada ýygnalýar java.util.concurrent. Olary aşakdaky ýaly işleýşine görä shematiki taýdan bölüp bolar: 26-njy dereje. Dereje derejesindäki söhbetdeşlik soraglaryna jogaplar.  Bölüm 2. 6-9, 11-12 - 2-nji soraglarBilelikdäki kolleksiýalarjava.util - paketdäki adaty uniwersal kolleksiýalara garanyňda köp sapakly gurşawda has netijeli işleýän kolleksiýalar toplumy . Collections.synchronizedListCollectionygyndylara girişi petikleýän esasy örtügiň ýerine maglumat segmentlerindäki gulplar ulanylýar ýa-da garaşylmadyk algoritmleri ulanyp maglumatlary paralel okamak üçin iş optimallaşdyrylýar. Nobatlar - köp sapakly goldaw bilen nobatlary blokirlemezlik we blokirlemezlik. Blokirlemeýän nobatlar, sapaklary bloklamazdan tizlik we işlemek üçin niýetlenendir. Blokirleme nobatlary, käbir şertler ýerine ýetirilmedik halatynda, “Öndüriji” ýa-da “Sarp ediji” sapaklaryny “haýallatmaly” bolanda ulanylýar, mysal üçin nobat boş ýa-da dolup ýa-da mugt “Sarp ediji” ýok. Sinhronizatorlar sapaklary sinhronlamak üçin kömekçi kömekçi enjamlar. “Paralel” hasaplamada güýçli ýarag. Ecutorerine ýetirijiler - sapak howuzlaryny döretmek, asynkron meseleleri meýilleşdirmek we netijeleri almak üçin ajaýyp çarçuwalary öz içine alýar. Gulplarsynchronized - esasylary bilen waitdeňeşdirilende alternatiw we has çeýe sapak sinhronizasiýa mehanizmlerini aňladýar notify. Atomika - başlangyç we salgylanmalar boýunça atom amallaryny goldaýan sapaklar. Çeşme:notifyAll

7. Kankarensiden haýsy sapaklary bilýärsiňiz?

Bu soraga jogap bu makalada gaty gowy beýan edilýär . Bularyň hemmesini gaýtadan çap etmegiň manysyny göremok, şonuň üçin diňe gysgaça tanyşmak mertebesine eýe bolan şol synplaryň beýanyny bererin. “ConcurrentHashMap” <K, V> - Maglumatlar Hashtablewe bloklardan synhronizedtapawutlylykda HashMap, düwmeler hasalaryna bölünen segmentler görnüşinde görkezilýär. Netijede, maglumatlara bir obýekt däl-de, segmentler girýär. Mundan başga-da, iteratorlar belli bir wagt üçin maglumatlary görkezýärler we zyňmaýarlar ConcurrentModificationException. AtomicBoolean, AtomicInteger, AtomicLong, AtomicIntegerArray, AtomicLongArray - Bir synpda bir ýönekeý üýtgeýjä girişi sinhronlamak zerur bolsa näme etmeli int? Gurluşyklary we atom synchronizedamallaryny ulananyňyzda ulanyp bilersiňiz set/get. volatileNewöne täze sapaklary ulanyp hasam gowy edip bilersiňiz Atomic*. CAS-yň ulanylmagy sebäpli, bu synplar bilen amallar sinhronlananlardan has çalt synchronized/volatile. Mundan başga-da, belli bir mukdarda atom goşmagyň, artmagyň / azalmagyň usullary bar.

8. “ConcurrentHashMap” synpy nähili işleýär?

Girizilen wagty ConcurrentHashMapJava döredijiler aşakdaky hash kartasyny durmuşa geçirmeli boldular:
  • Tekstiň howpsuzlygy
  • Girip barýarkaňyz, tutuş stoluň üstünde gulp ýok
  • Okalýan amal ýerine ýetirilende stol gulplarynyň ýoklugy islenýär
Durmuşa geçirmegiň esasy ideýalary ConcurrentHashMapaşakdakylar:
  1. Kartanyň elementleri

    Elementlerden tapawutlylykda HashMap, Entrydiýlip ConcurrentHashMapyglan edilýär volatile. JMM- de bolup geçen üýtgeşmeler sebäpli bu möhüm aýratynlyk .

    static final class HashEntry<K, V> {
        final K key;
        final int hash;
        volatile V value;
        final HashEntry<K, V> next;
    
        HashEntry(K key, int hash, HashEntry<K, V> next, V value) {
            this .key = key;
            this .hash = hash;
            this .next = next;
            this .value = value;
         }
    
        @SuppressWarnings("unchecked")
        static final <K, V> HashEntry<K, V>[] newArray(int i) {
            return new HashEntry[i];
        }
    }
  2. Haş funksiýasy

    ConcurrentHashMapgowulandyrylan ýuwmak funksiýasy hem ulanylýar.

    JDK 1.2 -de nähili bolandygyny ýatladýaryn HashMap:

    static int hash(int h) {
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }

    ConcurrentHashMap JDK 1.5 wersiýasy:

    private static int hash(int h) {
        h += (h << 15) ^ 0xffffcd7d;
        h ^= (h >>> 10);
        h += (h << 3);
        h ^= (h >>> 6);
        h += (h << 2) + (h << 14);
        return h ^ (h >>> 16);
    }

    Näme üçin hash funksiýasyny has çylşyrymly etmek zerurlygy bar? Haş kartasyndaky tablisalaryň uzynlygy iki güýç bilen kesgitlenýär. Ikilik şekillendirişleri pes we ýokary pozisiýada tapawutlanmaýan hash kodlary üçin çaknyşarys. Haş funksiýasynyň çylşyrymlylygyny ýokarlandyrmak, bu meseläni diňe kartada çaknyşmak ähtimallygyny azaldyp çözýär.

  3. Bölümler

    Karta N dürli segmentlere bölünýär (tertip boýunça 16, iň ýokary bahasy 16 bit bolup biler we iki güýç bolup biler). Her segment karta elementleriniň sapakdan ygtybarly tablisasydyr. Bölümleriň sanyny köpeltmek, köp sanly segmenti üýtgetmek amallaryny höweslendirer, iş wagty petiklemek ähtimallygyny azaldar.

  4. ConcurrencyLevel

    Bu parametr ýat kartasynyň ulanylyşyna we kartadaky segmentleriň sanyna täsir edýär.

    Bölümleriň sany, “concurrencyLevel” -den iki sany iň ýakyn güýç hökmünde saýlanar. Deňlik derejesini peseltmek, ýazylanda sapaklaryň karta segmentlerini petiklemegini has ähtimallaşdyrýar. Görkezijä aşa baha bermek ýadyň netijesiz ulanylmagyna getirýär. Kartany diňe bir sapak üýtgedip, galanlary okasa, 1 bahasyny ulanmak maslahat berilýär.

  5. Jemi

    Şeýlelikde, esasy artykmaçlyklar we durmuşa geçiriş aýratynlyklary ConcurrentHashMap:

    • Kartada meňzeş hashmaptäsir ediş interfeýsi bar
    • Okamak amallary gulplary talap etmeýär we parallel ýerine ýetirilýär
    • Operationsazmak amallary köplenç päsgelçiliksiz paralel ýerine ýetirilip bilner
    • concurrencyLevelDöredilende, statistika okamak we ýazmak bilen kesgitlenýän zerur görkezilýär
    • valueKarta elementleriniň yglan edilen bahasy barvolatile
    Çeşme: “ConcurrentHashMap” nähili işleýär

9. Gulp synpy näme?

Umumy çeşmä elýeterliligi gözegçilikde saklamak üçin sinhronlaşdyrylan operatora alternatiw hökmünde gulplary ulanyp bileris. Gulplama funksiýasy gaplanýar java.util.concurrent.locks. Ilki bilen, sapak umumy çeşmä girmäge synanyşýar. Mugt bolsa, sapakda gulp goýulýar. Iş gutaransoň, umumy çeşmedäki gulp boşadylýar. Resurs mugt däl bolsa we eýýäm bir gulp goýlan bolsa, bu gulp çykýança sapak garaşýar. LockGulp synplary aşakdaky usullary kesgitleýän interfeýsi amala aşyrýar :
  • void lock():gulp alynýança garaşýar
  • boolean tryLock():gulp almaga synanyşýar; gulp alnan bolsa, hakyky bolýar . Gulp alynmasa, ýalňyş gaýdyp gelýär . Usuldan tapawutlylykda, lock()elýeterli bolmasa gulp almak üçin garaşmaýar
  • void unlock():gulpy aýyrýar
  • Condition newCondition():Conditionhäzirki gulp bilen baglanyşykly obýekti yzyna berýär
Umuman, gulplamagy guramak gaty ýönekeý: gulpy almak üçin usul diýilýär lock()we umumy çeşmeler bilen işlemek gutaransoň, unlock()gulpy boşadýan usul diýilýär. Obýekt Conditionblokirlemäni dolandyrmaga mümkinçilik berýär. Düzgün bolşy ýaly, gulplar bilen işlemek üçin ReentrantLockpaketden bir synp ulanylýar. java.util.concurrent.locks.Bu synp interfeýsi amala aşyrýar Lock. Mysal üçin kiçijik bir programma ulanyp, Java Lock API ulanmaga seredeliň: Şeýlelik bilen, Resourcesapak howpsuzlygy talap edilmeýän birnäçe sapakdan ygtybarly usul we usul bar.
public class Resource {

    public void doSomething(){
        // пусть здесь происходит работа с базой данных
    }

    public void doLogging(){
        // потокобезопасность для логгирования нам не требуется
    }
}
RunnableIndi interfeýsi amala aşyrýan we synp usullaryny ulanýan synp alalyň Resource.
public class SynchronizedLockExample implements Runnable{

    // экземпляр класса Resource для работы с методами
    private Resource resource;

    public SynchronizedLockExample(Resource r){
        this.resource = r;
    }

    @Override
    public void run() {
        synchronized (resource) {
            resource.doSomething();
        }
        resource.doLogging();
    }
}
Indi ýokardaky programmany ýerine derek Lock API ulanyp täzeden ýazalyň synchronized.
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

// класс для работы с Lock API. Переписан с приведенной выше программы,
// но уже без использования ключевого слова synchronized
public class ConcurrencyLockExample implements Runnable{

    private Resource resource;
    private Lock lock;

    public ConcurrencyLockExample(Resource r){
        this.resource = r;
        this.lock = new ReentrantLock();
    }

    @Override
    public void run() {
        try {
            // лочим на 10 секунд
            if(lock.tryLock(10, TimeUnit.SECONDS)){
            resource.doSomething();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            //убираем лок
            lock.unlock();
        }
        // Для логгирования не требуется потокобезопасность
        resource.doLogging();
    }

}
Programmadan görnüşi ýaly, tryLock()sapagyň diňe belli bir wagta garaşýandygyna göz ýetirmek üçin usuly ulanýarys. Obýektiň gulpuny almasa, diňe hasaba girýär we çykýar. Anotherene bir möhüm nokat. Usul kadadan çykma try-finallybolsa-da, gulpuň boşadylmagyny üpjün etmek üçin blok ulanmaly . Çeşmeler:doSomething()

11. Muteks näme?

Mutex sapaklary / amallary sinhronlamak üçin ýörite obýektdir. Iki ştaty alyp biler - meşgul we mugt. Simplönekeýleşdirmek üçin, mutex iki bahany alýan boolean üýtgeýjidir: meşgul (hakyky) we erkin (ýalan). Bir sapak haýsydyr bir obýektiň aýratyn eýeçiligini islese, muteeksini işli diýip belleýär we onuň bilen işleşip bolansoň, muteeksini erkin diýip belleýär. Java-daky her bir obýekte mutex dakylýar. Mutex-e diňe Java enjamy girip biler. Programmistden gizlenýär.

12. Monitor näme?

Monitor ýörite mehanizmdir (kod bölegi) - muteeksiň üstündäki goşundy, onuň bilen dogry işlemegi üpjün edýär. Galyberse-de, obýektiň meşguldygyny bellemek ýeterlik däl, beýleki sapaklaryň hem meşgul obýekti ulanmaga synanyşmazlygyny üpjün etmelidiris. Java-da monitor açar söz ulanyp amala aşyrylýar synchronized. Sinhronlaşdyrylan blok ýazanymyzda, Java düzüjisi ony üç bölek kod bilen çalyşýar:
  1. Blokyň başynda synchronizedmuteeksiň meşguldygyny görkezýän kod goşulýar.
  2. Blok gutarandan soň, synchronizedmuteeksiň mugtdygyny görkezýän kod goşulýar.
  3. Blokdan öň synchronizedkod goşulýar, muteeksiň meşguldygyny ýa-da ýokdugyny barlaýan bolsa, sapak onuň çykmagyna garaşmalydyr.
1-nji bölüm
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION