6. Канкаренси чист?
Concurrency китобхонаи синфӣ дар Java мебошад, ки дорои синфҳои махсусест, ки барои кор дар риштаҳои сершумор оптимизатсия шудаанд. Ин синфҳо дар як баста ҷамъ карда мешавандjava.util.concurrent
. Онҳоро аз рӯи функсияҳо ба таври схематикӣ тақсим кардан мумкин аст: Коллексияҳои ҳамзамон - маҷмӯи коллексияҳо, ки дар муҳити чанд ришта нисбат ба коллексияҳои универсалии стандартии 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
инҳоянд:
-
Унсурҳои харита
Баръакси элементҳо
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]; } }
-
Функсияи хэш
ConcurrentHashMap
функсияи такмилёфтаи ҳашинг низ истифода мешавад.Биёед ба шумо хотиррасон кунам, ки он дар
HashMap
JDK 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 танҳо ин мушкилотро ҳал мекунад ва эҳтимолияти бархӯрдҳоро дар харита коҳиш медиҳад.
-
Сегментҳо
Харита ба N сегментҳои гуногун тақсим шудааст (бо нобаёнӣ 16, арзиши максималӣ метавонад 16 бит бошад ва қудрати ду аст). Ҳар як сегмент як ҷадвали бехатари унсурҳои харита мебошад. Афзоиши шумораи сегментҳо амалиёти тағиротро барои фарогирии якчанд сегмент ҳавасманд мекунад ва эҳтимолияти басташавӣ дар вақти корро коҳиш медиҳад.
-
ConcurrencyLevel
Ин параметр ба истифодаи корти хотира ва шумораи сегментҳои корт таъсир мерасонад.
Шумораи сегментҳо ҳамчун қудрати наздиктарини ду бузургтар аз concurrencyLevel интихоб карда мешаванд. Паст кардани сатҳи concurrencyLevel эҳтимоли зиёд дорад, ки риштаҳо ҳангоми навиштан сегментҳои харитаҳоро маҳкам кунанд. Аз ҳад зиёд баҳо додан ба нишондиҳанда боиси бесамар истифода шудани хотира мегардад. Агар танҳо як ришта харитаро тағир диҳад ва боқимонда хонда шавад, тавсия дода мешавад, ки арзиши 1 -ро истифода баред.
-
Ҳамагӣ
Ҳамин тариқ, бартариҳои асосӣ ва хусусиятҳои татбиқ
ConcurrentHashMap
:hashmap
Харита дорои интерфейси мутақобилаи монанд ба- Амалиётҳои хониш қуфлҳоро талаб намекунанд ва дар баробари иҷро мешаванд
- Амалиётҳои навиштанро аксар вақт бидуни басташавӣ дар мувозӣ иҷро кардан мумкин аст
- Ҳангоми эҷод, як талаб карда мешавад
concurrencyLevel
, ки бо хондан ва навиштани омор муайян карда мешавад - Унсурҳои харита дорои арзиши
value
эълоншуда мебошандvolatile
9. Синфи Lock чист?
Барои назорати дастрасӣ ба манбаи муштарак, мо метавонем қулфҳоро ҳамчун алтернатива ба оператори ҳамоҳангшуда истифода барем. Функсияи қулфкунӣ дар бастабандӣ карда шудаастjava.util.concurrent.locks
. Аввалан, ришта кӯшиш мекунад, ки ба манбаи муштарак дастрасӣ пайдо кунад. Агар он озод бошад, пас дар ришта қулф гузошта мешавад. Пас аз анҷоми кор, қулф дар манбаи муштарак озод карда мешавад. Агар манбаъ ройгон набошад ва дар он қулф аллакай гузошта шуда бошад, пас ришта то озод шудани ин қулф интизор мешавад. Синфҳои қулф интерфейсеро амалӣ мекунанд Lock
, ки усулҳои зеринро муайян мекунад:
void lock():
то ба даст овардани қулф интизор мешавадboolean tryLock():
кӯшиш мекунад, ки қулфро ба даст орад; агар қулф ба даст оварда шавад, он ҳақиқиро бармегардонад . Агар қулф ба даст наояд, он баргардонад false . Баръакси усул,lock()
он интизор нест, ки қулф дар сурати мавҷуд набудани қулф пайдо шавадvoid unlock():
қуфлро хориҷ мекунадCondition newCondition():
an objectеро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()
, то боварӣ ҳосил кунем, ки ришта танҳо миқдори муайяни вақтро интизор аст. Агар он қулфро дар 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 иваз мекунад:
- Дар оғози блок
synchronized
, code илова карда мешавад, ки мутексро ҳамчун банд қайд мекунад. - Дар охири блок,
synchronized
code илова карда мешавад, ки мутексро ҳамчун ройгон қайд мекунад. - Пеш аз блок,
synchronized
code илова карда мешавад, ки тафтиш мекунад, ки оё мутекс банд аст, пас ришта бояд озод шудани онро интизор шавад.
GO TO FULL VERSION