JavaRush /Java блогы /Random-KK /Деңгей 26. Деңгейлік тақырып бойынша сұхбат сұрақтарына ж...
zor07
Деңгей
Санкт-Петербург

Деңгей 26. Деңгейлік тақырып бойынша сұхбат сұрақтарына жауаптар. 2-бөлім. 6-9, 11-12 сұрақтар

Топта жарияланған
Деңгей 26. Деңгейлік тақырып бойынша сұхбат сұрақтарына жауаптар.  2-бөлім. 6-9, 11-12 сұрақтар - 1

6. Канкаренци дегеніміз не?

Concurrency — бірнеше ағындар бойынша жұмыс істеу үшін оңтайландырылған арнайы сыныптарды қамтитын Java тіліндегі сынып кітапханасы. Бұл сыныптар пакетте жиналады java.util.concurrent. Оларды функционалдық мүмкіндіктеріне қарай схемалық түрде келесідей бөлуге болады: Деңгей 26. Деңгейлік тақырып бойынша сұхбат сұрақтарына жауаптар.  2-бөлім. 6-9, 11-12 - 2 сұрақтарConcurrent Collectionsjava.util – бумадағы стандартты әмбебап жинақтарға қарағанда көп ағынды ортада тиімдірек жұмыс істейтін жинақтар жиынтығы . Бүкіл жинаққа қол жеткізуді бұғаттайтын негізгі қаптаманың орнына Collections.synchronizedListдеректер сегменттеріндегі құлыптар пайдаланылады немесе күтусіз алгоритмдерді пайдаланып деректерді параллель оқу үшін жұмыс оңтайландырылған. Кезектер – көп ағынды қолдауы бар блокталмаған және блоктаушы кезектер. Блокталмайтын кезек ағындарды блоктаусыз жылдамдық пен жұмыс істеуге арналған. Блоктау кезектері кейбір шарттар орындалмаса, мысалы, кезек бос немесе толып кетсе немесе бос «Тұтынушы» болмаса, «Өндіруші» немесе «Тұтынушы» ағындарын «баяулату» қажет болғанда қолданылады. Синхронизаторлар ағындарды синхрондау үшін көмекші утorталар болып табылады. Олар «параллельді» есептеулерде қуатты қару болып табылады. Орындаушылар - ағынды пулдарды құру, асинхронды тапсырмаларды жоспарлау және нәтижелерді алу үшін тамаша құрылымдарды қамтиды. Құлыптарsynchronized - негізгімен waitсалыстырғанда балама және икемді жіптерді синхрондау механизмдерін білдіреді notify. Атомика – примитивтер мен сілтемелер бойынша атомдық операцияларды қолдайтын сыныптар. Дереккөз:notifyAll

7. Канкаренсидің қандай кластарын білесіз?

Бұл сұрақтың жауабы осы мақалада толық жазылған . Мен мұның бәрін осы жерде қайта басып шығарудың мәнін көрмеймін, сондықтан мен қысқаша танысу құрметіне ие болған сыныптардың сипаттамасын ғана беремін. ConcurrentHashMap<K, V>Hashtable - және блоктарынан synhronizedайырмашылығы , HashMapдеректер кілттердің хэштеріне бөлінген сегменттер түрінде ұсынылады. Нәтижесінде деректерге бір нысан емес, сегменттер арқылы қол жеткізіледі. Сонымен қатар, итераторлар белгілі бір уақыт кезеңі үшін деректерді көрсетеді және тастамайды ConcurrentModificationException. AtomicBoolean, AtomicInteger, AtomicLong, AtomicIntegerArray, AtomicLongArray - Егер сыныпта бір қарапайым түрдегі айнымалыға қатынасты синхрондау қажет болса ше int? Сіз конструкцияларды пайдалана аласыз synchronizedжәне атомдық операцияларды пайдаланғанда set/get, volatile. Бірақ сіз жаңа сабақтарды пайдалану арқылы одан да жақсырақ жасай аласыз Atomic*. CAS пайдаланудың арқасында бұл сыныптармен операциялар арқылы синхрондалғанға қарағанда жылдамырақ synchronized/volatile. Сонымен қатар, белгілі бір мөлшерде атомды қосу, сондай-ақ арттыру/азайту әдістері бар.

8. ConcurrentHashMap класы қалай жұмыс істейді?

Оны енгізу кезінде ConcurrentHashMapJava әзірлеушілеріне келесі хэш картасын енгізу қажет болды:
  • Жіп қауіпсіздігі
  • Оған кіру кезінде бүкіл үстелде құлыптар болмайды
  • Оқу әрекетін орындау кезінде кесте құлыптары болмағаны жөн
Іске асырудың негізгі идеялары ConcurrentHashMapмыналар:
  1. Карта элементтері

    Элементтерден айырмашылығы HashMap, Entryin ConcurrentHashMapретінде жарияланады volatile. Бұл маңызды мүмкіндік, сонымен қатар JMM өзгерістеріне байланысты .

    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. Хэш функциясы

    ConcurrentHashMapжақсартылған хэштеу функциясы да пайдаланылады.

    JDK 1.2 -де қандай болғанын еске салайын HashMap:

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

    ConcurrentHashMap JDK 1.5 нұсқасы:

    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);
    }

    Неліктен хэш функциясын күрделірек ету қажет? Хэш картадағы кестелердің ұзындығы екінің күшімен анықталады. Екілік көрсетілімдері төмен және жоғары позицияда ерекшеленбейтін хэш-codeтар үшін бізде соқтығыстар болады. Хэш функциясының күрделілігін арттыру бұл мәселені шешеді, картадағы соқтығыстардың ықтималдығын азайтады.

  3. Сегменттер

    Карта N түрлі сегменттерге бөлінген (әдепкі бойынша 16, ең үлкен мән 16 бит болуы мүмкін және екінің күші). Әрбір сегмент карта элементтерінің ағынмен қауіпсіз кестесі болып табылады. Сегменттердің санын көбейту бірнеше сегменттерді қамту үшін өзгерту әрекеттерін ынталандырады, орындалу уақытында блоктау ықтималдығын азайтады.

  4. ConcurrencyLevel

    Бұл параметр жад картасын пайдалануға және картадағы сегменттер санына әсер етеді.

    Сегменттердің саны concurrencyLevel мәнінен үлкен екінің ең жақын күші ретінде таңдалады. ConcurrencyLevel деңгейін төмендету ағындардың жазу кезінде карта сегменттерін блоктау ықтималдығын арттырады. Көрсеткішті асыра бағалау жадының тиімсіз пайдаланылуына әкеледі. Тек бір ағын картаны өзгертсе, ал қалғандары оқитын болса, 1 мәнін пайдалану ұсынылады.

  5. Барлығы

    Сонымен, негізгі артықшылықтар мен іске асыру ерекшеліктері ConcurrentHashMap:

    • Картада ұқсас hashmapөзара әрекеттесу интерфейсі бар
    • Оқу операциялары құлыптарды қажет етпейді және параллель орындалады
    • Жазу операциялары жиі блоктаусыз қатар орындалады
    • Жасау кезінде қажеттісі көрсетіледі concurrencyLevel, статистиканы оқу және жазу арқылы анықталады
    • valueКарта элементтерінің ретінде жарияланған мәні барvolatile
    Дереккөз: ConcurrentHashMap қалай жұмыс істейді

9. Lock класы дегеніміз не?

Ортақ ресурсқа кіруді басқару үшін синхрондалған операторға балама ретінде құлыптарды пайдалана аламыз. Құлыптау функциясы ішінде жинақталған java.util.concurrent.locks. Біріншіден, ағын ортақ ресурсқа кіруге тырысады. Егер ол бос болса, онда жіпке құлып қойылады. Жұмыс аяқталғаннан кейін ортақ ресурстағы құлып босатылады. Егер ресурс бос болмаса және оған құлып әлдеқашан орналастырылса, ағын осы құлып босатылғанша күтеді. LockҚұлыптау кластары келесі әдістерді анықтайтын интерфейсті жүзеге асырады :
  • void lock():құлып алынғанша күтеді
  • boolean tryLock():құлыпты алуға тырысады; егер құлып алынса, ол true мәнін қайтарады . Егер құлып алынбаса, ол false мәнін қайтарады . Әдістен айырмашылығы, lock()ол қол жетімді болмаса, құлыпты алуды күтпейді
  • void unlock():құлыпты алып тастайды
  • Condition newCondition():Conditionағымдағы құлыппен байланысты нысанды қайтарады
Жалпы жағдайда құлыптауды ұйымдастыру өте қарапайым: құлыпты алу үшін әдіс , lock()ал ортақ ресурстармен жұмысты аяқтағаннан кейін unlock()құлыпты босататын әдіс деп аталады. Нысан Conditionблоктауды басқаруға мүмкіндік береді. Әдетте, құлыптармен жұмыс істеу үшін ReentrantLockпакеттен класс пайдаланылады.Бұл java.util.concurrent.locks.класс интерфейсті жүзеге асырады Lock. Мысал ретінде шағын бағдарлама арқылы Java Lock API пайдалануды қарастырайық: Сонымен, бізде Resourceжіп қауіпсіздігі талап етілмейтін бірнеше ағынды қауіпсіз әдістер мен әдістер бар сынып бар делік.
public class Resource {

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

    public void doLogging(){
        // потокобезопасность для логгирования нам не требуется
    }
}
RunnableЕнді интерфейсті жүзеге асыратын және класс әдістерін қолданатын сыныпты алайық 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();
    }
}
Енді жоғарыдағы бағдарламаны орнына Lock API арқылы қайта жазайық 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();
    }

}
Бағдарламадан көріп отырғаныңыздай, біз tryLock()ағынның белгілі бір уақытты ғана күтетініне көз жеткізу үшін әдісті қолданамыз. Егер ол нысанда құлыпты алмаса, ол жай ғана журналға тіркеледі және шығады. Тағы бір маңызды сәт. Әдіс ерекше жағдайды шығарса try-finallyда, құлыптың босатылуын қамтамасыз ету үшін блокты пайдалану керек . Дереккөздер:doSomething()

11. Мутекс дегеніміз не?

Мутекс – ағындарды/процестерді синхрондау үшін арнайы нысан. Ол екі күйді қабылдай алады - бос емес және бос. Жеңілдету үшін, мутекс екі мәнді қабылдайтын логикалық айнымалы болып табылады: бос емес (шын) және бос (жалған). Жіп an objectінің ерекше иелігін қалаған кезде, ол өзінің мутексін бос емес деп белгілейді, ал онымен жұмысты аяқтаған кезде, ол өзінің мутексін бос деп белгілейді. Мутекс Java тіліндегі әрбір нысанға бекітілген. Мутекске тек Java машинасы ғана қол жеткізе алады. Ол бағдарламашыдан жасырылған.

12. Монитор дегеніміз не?

Монитор – бұл арнайы механизм (code бөлігі) – мутекс үстіндегі қосымша, ол онымен дұрыс жұмыс істеуді қамтамасыз етеді. Өйткені, нысанның бос емес екенін белгілеу жеткіліксіз, біз басқа ағындардың бос емес нысанды қолдануға тырыспауын қамтамасыз етуіміз керек. Java тілінде монитор кілт сөзі арқылы жүзеге асырылады synchronized. Синхрондалған блокты жазғанда, Java компиляторы оны үш code бөлігімен ауыстырады:
  1. Блоктың басында synchronizedмутексті бос емес деп белгілейтін code қосылады.
  2. Блоктың соңында synchronizedмутексті бос деп белгілейтін code қосылады.
  3. Блоктан бұрын synchronizedмутекс бос емес екенін тексеретін code қосылады, содан кейін ағын оның босатылуын күтуі керек.
1 бөлім
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION