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ýarjava.util.concurrent
. Olary aşakdaky ýaly işleýşine görä shematiki taýdan bölüp bolar: Bilelikdä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.synchronizedList
Collectionygyndylara 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 wait
deň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> - MaglumatlarHashtable
we bloklardan synhronized
tapawutlylykda 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 synchronized
amallaryny ulananyňyzda ulanyp bilersiňiz set/get
. volatile
Newö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 wagtyConcurrentHashMap
Java 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
ConcurrentHashMap
aşakdakylar:
-
Kartanyň elementleri
Elementlerden tapawutlylykda
HashMap
,Entry
diýlipConcurrentHashMap
yglan edilýärvolatile
. 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]; } }
-
Haş funksiýasy
ConcurrentHashMap
gowulandyrylan ý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.
-
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.
-
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.
-
Jemi
Şeýlelikde, esasy artykmaçlyklar we durmuşa geçiriş aýratynlyklary
ConcurrentHashMap
:- Kartada meňzeş
hashmap
tä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
concurrencyLevel
Döredilende, statistika okamak we ýazmak bilen kesgitlenýän zerur görkezilýärvalue
Karta elementleriniň yglan edilen bahasy barvolatile
- Kartada meňzeş
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ýarjava.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. Lock
Gulp synplary aşakdaky usullary kesgitleýän interfeýsi amala aşyrýar :
void lock():
gulp alynýança garaşýarboolean 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ýarvoid unlock():
gulpy aýyrýarCondition newCondition():
Condition
häzirki gulp bilen baglanyşykly obýekti yzyna berýär
lock()
we umumy çeşmeler bilen işlemek gutaransoň, unlock()
gulpy boşadýan usul diýilýär. Obýekt Condition
blokirlemäni dolandyrmaga mümkinçilik berýär. Düzgün bolşy ýaly, gulplar bilen işlemek üçin ReentrantLock
paketden 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, Resource
sapak howpsuzlygy talap edilmeýän birnäçe sapakdan ygtybarly usul we usul bar.
public class Resource {
public void doSomething(){
// пусть здесь происходит работа с базой данных
}
public void doLogging(){
// потокобезопасность для логгирования нам не требуется
}
}
Runnable
Indi 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-finally
bolsa-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ýarsynchronized
. Sinhronlaşdyrylan blok ýazanymyzda, Java düzüjisi ony üç bölek kod bilen çalyşýar:
- Blokyň başynda
synchronized
muteeksiň meşguldygyny görkezýän kod goşulýar. - Blok gutarandan soň,
synchronized
muteeksiň mugtdygyny görkezýän kod goşulýar. - Blokdan öň
synchronized
kod goşulýar, muteeksiň meşguldygyny ýa-da ýokdugyny barlaýan bolsa, sapak onuň çykmagyna garaşmalydyr.
GO TO FULL VERSION