JavaRush /Блоги Java /Random-TG /Сатҳи 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Коллексияҳои ҳамзамон - маҷмӯи коллексияҳо, ки дар муҳити чанд ришта нисбат ба коллексияҳои универсалии стандартии java.utilбаста самараноктар кор мекунанд. Ба ҷои бастабандии асосӣ Collections.synchronizedListбо бастани дастрасӣ ба тамоми маҷмӯа, қуфлҳо дар сегментҳои додаҳо истифода мешаванд ё кор барои мутолиаи мувозии додаҳо бо истифода аз алгоритмҳои бидуни интизорӣ оптимизатсия карда мешавад. Навбатҳо - баста нашудан ва бастани навбатҳо бо дастгирии бисёрсоҳавӣ. Навбатҳои бастанашаванда барои суръат ва кор бидуни бастани риштаҳо пешбинӣ шудаанд. Навбатҳои басташавӣ вақте истифода мешаванд, ки ба шумо лозим аст, ки риштаҳои "Истеҳсолкунанда" ё "Истеъмолкунанда" -ро "суст" кунед, агар баъзе шартҳо иҷро нашаванд, масалан, навбат холӣ ё пур аз пур аст ё "Истеъмолкунанда"-и ройгон вуҷуд надорад. Синхронизаторҳо утorтаҳои ёрирасон барои ҳамоҳангсозии риштаҳо мебошанд. Онҳо як силоҳи пурқувват дар ҳисоббарории "параллелӣ" мебошанд. Иҷрокунандагон - дорои чаҳорчӯбаҳои аъло барои эҷоди ҳавзҳои ришта, банақшагирии вазифаҳои асинхронӣ ва ба даст овардани натиҷаҳо мебошанд. Қулфҳо - механизмҳои алтернативии синхронизатсияи риштаро нисбат ба механизмҳои synchronizedасосӣ waitнамояндагӣ мекунанд notify. Атомика - синфҳо бо дастгирии амалиёти атомӣ дар ибтидоӣ ва истинодҳо. Сарчашма:notifyAll

7. Кадом синфҳои Канкаренсиро медонед?

Ҷавоб ба ин савол дар ин мақола ба таври комил баён шудааст . Ман дар ин ҷо дубора чоп кардани ҳама чизро намебинам, бинобар ин ман танҳо тавсифи он синфҳоро медиҳам, ки шарафи мухтасар шинос шуданро доштам. ConcurrentHashMap<K, V> - Баръакси Hashtableва блокҳо synhronizedдар HashMap, маълумот дар шакли сегментҳо пешниҳод карда мешавад, ки ба хэшҳои калидҳо тақсим карда мешавад. Дар натиҷа, ба маълумотҳо на аз ҷониби як an object, балки аз ҷониби сегментҳо дастрас карда мешаванд. Илова бар ин, итераторҳо маълумотро барои як давраи муайян намояндагӣ мекунанд ва ConcurrentModificationException. AtomicBoolean, AtomicInteger, AtomicLong, AtomicIntegerArray, AtomicLongArray - Чӣ мешавад, агар дар синф ба шумо дастрасӣ ба як тағирёбандаи оддии навъи синхронизатсия лозим шавад int? Шумо метавонед конструксияҳоро бо , synchronizedва ҳангоми истифодаи амалиёти атомӣ истифода баред set/get. volatileАммо шумо метавонед бо истифода аз синфҳои нав боз ҳам беҳтар кор кунед Atomic*. Аз сабаби истифодаи CAS, амалиёт бо ин синфҳо назар ба синхронизатсия тавассути synchronized/volatile. Ғайр аз он, усулҳои илова кардани атом бо миқдори муайян ва инчунин афзоиш/камкунӣ мавҷуданд.

8. Синфи ConcurrentHashMap чӣ гуна кор мекунад?

То замони ҷорӣ шудани он, ConcurrentHashMapтаҳиягарони Java ба татбиқи харитаи hash зерин ниёз доштанд:
  • Бехатарии ришта
  • Ҳангоми дастрасӣ ба он дар тамоми миз қулф нест
  • Хуб аст, ки ҳангоми иҷрои амалиёти хониш қуфлҳои ҷадвал вуҷуд надошта бошанд
Идеяҳои асосии амалӣ ConcurrentHashMapинҳоянд:
  1. Унсурҳои харита

    Баръакси элементҳо HashMap, Entryдар 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функсияи такмилёфтаи ҳашинг низ истифода мешавад.

    Биёед ба шумо хотиррасон кунам, ки он дар HashMapJDK 1.2 чӣ гуна буд:

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

    Чаро зарурати мураккабтар кардани функсияи hash вуҷуд дорад? Ҷадвалҳои харитаи ҳаш дарозӣ доранд, ки бо қувваи ду муайян карда мешаванд. Барои рамзҳои хэш, ки намояндагии дуӣ дар мавқеи паст ва баланд фарқ намекунанд, мо бархӯрд хоҳем дошт. Баланд бардоштани мураккабии функсияи hash танҳо ин мушкилотро ҳал мекунад ва эҳтимолияти бархӯрдҳоро дар харита коҳиш медиҳад.

  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():кӯшиш мекунад, ки қулфро ба даст орад; агар қулф ба даст оварда шавад, он ҳақиқиро бармегардонад . Агар қулф ба даст наояд, он баргардонад false . Баръакси усул, lock()он интизор нест, ки қулф дар сурати мавҷуд набудани қулф пайдо шавад
  • void unlock():қуфлро хориҷ мекунад
  • Condition newCondition():an objectеро Condition, ки бо қулфи ҷорӣ алоқаманд аст, бармегардонад
Ташкor қулфкунӣ дар ҳолати умумӣ хеле содда аст: барои ба даст овардани қулф, усул номида мешавад 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(), то боварӣ ҳосил кунем, ки ришта танҳо миқдори муайяни вақтро интизор аст. Агар он қулфро дар an object ба даст наорад, он танҳо сабт мекунад ва мебарояд. Боз як нуктаи муҳим. Шумо бояд блокро истифода баред try-finally, то боварӣ ҳосил кунед, ки қулф озод карда мешавад, ҳатто агар усул doSomething()истисноро ба вуҷуд орад. Сарчашмаҳо:

11. Мутекс чист?

Мутекс як an objectи махсус барои ҳамоҳангсозии риштаҳо/равандҳо мебошад. Он метавонад ду ҳолатро дар бар гирад - банд ва ройгон. Барои содда кардан, мутекс як тағирёбандаи мантиқист, ки ду арзишро мегирад: банд (ҳақиқӣ) ва озод (дурӯғ). Вақте ки ришта моликияти истисноии an objectро мехоҳад, он мутекси худро ҳамчун банд қайд мекунад ва вақте ки кор бо он анҷом ёфт, мутекси худро озод қайд мекунад. Мутекс ба ҳар як an object дар Java замима карда мешавад. Танҳо мошини Java дастрасии мустақим ба mutex дорад. Он аз барномасоз пинҳон аст.

12. Монитор чист?

Монитор як механизми махсус (як порчаи code) - иловаи болои мутекс мебошад, ки кори дурустро бо он таъмин мекунад. Дар ниҳоят, қайд кардан кифоя нест, ки an object банд аст; мо бояд боварӣ ҳосил кунем, ки дигар риштаҳо кӯшиш намекунанд an objectи бандро истифода баранд. Дар Java, монитор бо истифода аз калимаи калидӣ амалӣ карда мешавад synchronized. Вақте ки мо блоки ҳамоҳангшударо менависем, компилятори Java онро бо се дона code иваз мекунад:
  1. Дар оғози блок synchronized, code илова карда мешавад, ки мутексро ҳамчун банд қайд мекунад.
  2. Дар охири блок, synchronizedcode илова карда мешавад, ки мутексро ҳамчун ройгон қайд мекунад.
  3. Пеш аз блок, synchronizedcode илова карда мешавад, ки тафтиш мекунад, ки оё мутекс банд аст, пас ришта бояд озод шудани онро интизор шавад.
Қисми 1
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION