/ / Ak sú všetky atribúty kolekcie bezpečné pre vlákna, môžeme povedať, že táto kolekcia je vhodná pre vlákna? - java, zbierky, bezpečnosť vlákien

Ak sú všetky atribúty kolekcie bezpečné pre nite, môžeme povedať, že táto kolekcia je bezpečné pre nite? - java, zbierky, bezpečnosť závitov

Ak sú všetky atribúty (alebo polia položiek alebo dátové členy) zbierky Java thread-safe (CopyOnWriteArraySet,ConcurrentHashMap, BlockingQueue, ...), môžeme povedať, že táto zbierka je thread-safe ?

príklad:

public class AmIThreadSafe {

private CopyOnWriteArraySet thradeSafeAttribute;

public void add(Object o) {
thradeSafeAttribute.add(o);
}

public void clear() {
thradeSafeAttribute.clear();
}
}

v tejto vzorke to môžeme povedať AmIThreadSafe je thread-safe ?

odpovede:

2 pre odpoveď č. 1

Stručná odpoveď: Nie.

O niečo dlhšia odpoveď: pretože add () a clear () nie sú nijak synchronizované a HashSet nie je synchronizovaný, je možné, aby v nich bolo súčasne viac vlákien.

Upraviť nasledujúci komentár: Aha. Krátka odpoveď je Áno, sorta, :)

Dôvod „sorta“ (americký slangčo znamená čiastočne, btw) je, že je možné, aby dve operácie boli atómovo bezpečné, ale aby boli nebezpečné, ak sa použijú v kombinácii na vykonanie zloženej operácie.

V danom príklade, kde sú podporované iba funkcie add () a clear (), sa to nemôže stať.

Ale v kompletnejšej triede, kde by sme mali viac rozhrania Collection, si predstavme volajúceho, ktorý potrebuje pridať záznam do sady, ak už sada nemá viac ako 100 záznamov.

Tento volajúci by chcel napísať metódu asi takto:


void addIfNotOverLimit (AmIThreadSafe set, Object o, int limit) {
if (set.size() < limit)      // ## thread-safe call 1
set.add(o);               // ## thread-safe call 2
}

Problém je v tom, že zatiaľ čo každý hovor je sám o sebethreadsafe, dve vlákna by mohli byť v addIfNotOverLimit (alebo, celkovo, pridaním prostredníctvom inej metódy), a tak by vlákna A volali size () a dostali 99 a potom zavolali add (), ale skôr ako sa to stane, mohlo by to byť prerušené a vlákno B by potom mohlo pridať položku a teraz by množina presahovala svoj limit.

Morálne? Vďaka zloženým operáciám je definícia pojmu „vlákno bezpečná“ zložitejšia.


3 pre odpoveď č. 2

Za predpokladu, že „atribútmi“ myslíte „to, čo kolekcia obsahuje“, potom nie. Len preto, že Collection drží predmety bezpečné pre vlákna neznamená, že Collection"implementačné nástroje add(), clear(), remove(), atď., spôsobom bezpečným pre vlákna.


2 pre odpoveď č. 3

Nie, pretože stav objektu je „súčtom“ všetkých jeho atribútov.

napríklad môžete mať 2 bezpečné pre vláknazbierky ako atribúty vo vašom objekte. váš objekt navyše môže závisieť od akejsi korelácie medzi týmito 2 kolekciami (napr. ak je objekt v 1 kolekcii, je v inej kolekcii a naopak). jednoduché použitie 2 kolekcií bezpečných pre vlákna nezabezpečí, aby bola korelácia pravdivá vo všetkých časových okamihoch. budete potrebovať ďalšiu kontrolu súbežnosti vo vašom objekte, aby ste sa ubezpečili, že toto obmedzenie platí pre 2 kolekcie.

pretože väčšina netriviálnych objektov má medzi svojimi atribútmi určitý druh korelačného vzťahu, použitie kolekcií bezpečných pre vlákna ako atribútov nestačí na to, aby bol objekt bezpečný pre vlákna.


1 pre odpoveď č. 4

Čo je to bezpečnosť nití?

Bezpečnosť nití jednoducho znamená, že polia objektu alebo triedy vždy udržiavať platný stav, ako je uvedené v iné predmety a triedy, aj keď používa súčasne viac vlákien.

Objekt bezpečný pre vlákno je ten, ktorý vždy zachováva platný stav, ako pozorované inými triedami a predmetmi, aj vo viacvláknovom prostredí.

Podľa dokumentácie API musíte na zaistenie bezpečnosti vlákien použiť túto funkciu:

synchronizedCollection(Collection c)
Returns a synchronized (thread-safe) collection
backed by the specified collection

Keď to čítam, myslím si, že musítepoužite vyššie uvedenú funkciu na zaistenie zbierky bezpečnej pre vlákna. Nemusíte ich však používať pre všetky kolekcie a existujú rýchlejšie kolekcie, ktoré sú bezpečné pre vlákna, napríklad ConcurrentHashMap. Podstata nástroja CopyOnWriteArraySet zaisťuje operácie bezpečné pre vlákna.