lab4, 5, 6, 7(java) Flashcards

1
Q

Cum implementam un nou thread in java?

A

varianta 1: putem sa cream o clasa care implementeaza interfata Runnable, si contine metoda void run()
varianta 2!!!: putem sa cream o clasa care EXTINDE clasa thread si suprascrie metoda void run()

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Cum rulam in paralel noul thread in java?

A

(daca am folosit class Task implements Runnable):

Thread t = new Thread(new Task());
t.start();

(!!!daca am folosit class MyThread extends Thread):

MyThread t = new MyThread();
t.start();

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

start() vs run() ?

A

cand e apelat run() codul prezent in metoda se rueaza secvential in cadrul thread-ului care a apelat-o.

cand e apelat start() JVM va crea un nou thread care va executa instructiunile din metoda run() in PARALEL cu threadul care a apelat metoda start().

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

asteptarea terminarii executiei unui thread

A

pentru a astepta terminarea unui thread, avem metoda public final void join() a clasei thread. Aceasta metoda arunca si exceptii de tipul InterruptedException

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

cum trimitem parametrii unui thread?

A

pentru a trimite parametrii doar adaugam o noua variabila in clasa pe care extindem thread ( sau pe care implementam runnable) si apoi voi seta acest parametru in contstructorul clasei

public class Task extends Thread{
public Task(int id) {
this.id = id;
}
}

public static void main(){
Thread t = new Task(id);
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

cum obtinem rezultate dintr-un thread?

A

pentru a obtine un rezultat de la thread, putem fie obtine un getter

public int getResult() {
return result;
}

fie putem sa facem campul ala public si sa l accesam din main (why tho?)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

cuvantul cheie synchronized

A

1.Daca o metoda e definita ca si “synchronized” atunci poate fi rulata de un singur thread in acelasi timp. Daca “monitorul” nu este detinut de niciun thread si metoda este apelata, atunci se va bloca monitorul pana cand metoda se termina de executat pe acel thread.

  1. Daca am doar doar un bloc de instructiune synchronized si nu o intreaga metoda, atunci codul dintre acoladele lui synchronized va folosi monitoril obiectului dintre paranteze:

synchronized(this){ // aici folosesc monitorul obiectului curent, adica e same shit ca si cum as avea metoda synchronized care face codul asta

}

  1. Daca am o metoda STATIC synchronized se va incerca obtinerea monitorului asociat clasei, deoarece metoda statica apartine clasei, nu a unei instante a clasei.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

ce inseamna “reentrant” ?

A

metodele si blocurile de cod synchronized sunt reentrante. Daca un thread a obtinut monitorul unui obiect, atunci acel thread poate intra in orice alt bloc si metoda sinzcronizate ce sunt asociate cu acel obiect (implicit acel monitor).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

ce e bariera ciclica (CyclicBarrier) ?

A

e un mecanism de (re)sincronizare a threadurilor lafel ca o bariera obisnuita. In java, e clasa CyclicBarrier, la instantierea careia se specifica nr de threaduri pe care le va sincroniza.

apelul await() pe bariera ciclica poate arunca exceptiile BrokenBarrierException si InterruptedException

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

cuvantul cheie volatile ?

A

daca o variabila e volatile inseamna ca nu poate fi optimizata, fiecare scriere/citire a acesteia se realizeaza lucrand cu memoria RAM.

Variabilele volatile cresc timpul de executie pentru ca modificarile trebuie propagate celorlalte threaduri, in timp ce variabilele normale pot fi cache-uite.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

De ce am folosi volatile?

A

Pentru ca sa prevenim optimizari incompatibile in combinatie cu modificarea valorii din alt thread/ a citirii unei date neactualizate. (idk man)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Ce e o operatie atomica?

A

O operatie ce nu poate fi divizata atunci cand este executata de catre un thread. (la a+= 2 de ex, mai intai avem citirea, apoi adunarea, apoi scrierea in a a valorii noi => NU e atomica)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

De ce am folosi atomicitate?

A

Pentru ca sa putem sa avem de ex un contor sau un acumulator fara a mai folosi mecanisme de sincronizare.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Ce inseamna busy waiting?

A

Daca un thread dureaza mult sa se ruleze, si celelalte thread-uri tot verifica daca s-a rulat, degeaba, pt ca o sa se termine de rulat abia peste o tona de timp. Astfel, nu are sens ca mereu sa blochez un mutex, si sa verific daca s a terminat thread-ul, cand pot sa l rog pe thread sa ma anunte el cand s a terminat cu wait(), notify(), notifyAll().

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

ce fac wait(), notify() si notifyAll()

A

wait() : forteaza threadul curent sa intre in asteptare pana cand alt thread apeleaza notify() sau notifyAll() pe acelasi obiect. Pentru ca asta sa se intample, trebuie sa detina monitoful obiectului respectiv.

Detinerea monitorului se intampla cand
s-a executat o metoda / un bloc synchronized pe obiect
s-a executat o metoda synchronized statica pe clasa din care face parte obiectul

notify(): alege ALEATORIU un thread care a apelat wait() si il trece din waiting in running

notifyAll() trece toate thread-urile din waiting in running

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Unde nu e bine sa folosim wait()

A

Pe obiecte cu vizibilitate globala sau stringuri constante, doearece JVM are o singura instanta a obiectului.

17
Q

Semafoarele in java

A

In java un semafor lasa mai multe thread uri sa coexiste intr o regiune critica

acquire() -> se incearca trecerea de semafor, iar daca numarul de threaduri e mai mic, atunci threadul poate sa intre
release() -> threadul anunta ca a iesit din zona critica si deci se elibereaza un loc

practic, un semafor e o generalizare a unui mutex ( semafor initializat cu 1 = mutex)

18
Q

Ce e deadlock? dar livelock?

A

deadlock = atunci cand 2 threaduri incearca sa apeleze resursele celuilalt (t1 tine P dar vrea Q si t2 tine Q dar vrea P).
livelock = cand 2 threaduri fac actiuni, astfel incat o actiune o blocheaza pe cealalta si viceversa.

19
Q

Producator -Consumator problema

A

2 threaduri : consumator, producator
producatorul nu produce cand e buffer-ul plin
consumatorul nu consuma cand e buffer-ul gol
amandoi nu pot actiona simultan

pericol de deadlock

putem rezolva problema cu semafoare sau variabile conditie

20
Q

Filozofii problema

A

N filozofi ( thread-uri) inceraca sa manance la o masa rotunda si au nevoie de ambele furculite ( lock-uri) ca sa manance.
o problema clasica de deadloc, daca toti incep cu tacamul din stanga / din dreapta.
soluta e sa inceapa unul singur din stanga, si restul din dreapta, si astfel ala care a inceput cu stanga are dreapta libera.

21
Q

Barbierul problema

A

un barbier ( un thread ), N scaune de asteptare si M clienti (thread-uri)

daca nu s clienti, barierul doarme
daca sunt clienti se aseaza in asteptare
iar daca scaunele sunt pline, pleaca

22
Q

Cititori - Scriitori problema

A

niste scriitori si niste cititori
un scriitor poate scrie daca nimeni nu scrie si nici nu citeste in momentul ala
un cititor nu poate citi acolo unde se scrie, dar mai multi cititori pot citi din acelasi loc

23
Q

Semaphore sem = new Semaphore(-1)

A

Daca un semafor e initializat cu o valoare negativa inseamna ca se asteapta 2 release-uri.

practic thread3 asteapta la semafor pana thread1 si thread2 au dat release chiar daca nu erau in semafor

24
Q

AtomicInteger + metodele lui ?

A

practic un int dar care ne ofera operatii atomice

get() -> returneaza valoare din int
set(x) -> seteaza valoarea din int la x
compareAndSet(x,y) ->compara int-ul cu x, si daca sunt egale, ia val y
addAndGet(delta) ->incrementeaza val curenta cu delta si returneaza
getAndAdd(delta) ->RETURNEAZA si apoi incrementeaza cu delta

e mai avantajos decat sa facem mereu lockuri (mai putin overhead)

25
Q

clasa ConcurrentHashMap?

A

este ca un HashTable ( NU un hashmap, pt ca NU permite sa folosesti null drept cheie) dar care atunci cand incerci sa apelezi o valoare pe un thread cu un lock, nu blochezi tot HashTable-ul.

metodele get() si put() blocheaza accesul doar la elementul la care umbla ( au mutexuri in implementarea lor) si NU la toata structura de date.

operatiile de tip get se pot suprapune cu cele de tip put, dar in spate se asigura ca mai intai dau put() si abia la final, vine get ul.

26
Q

metode ConcurrentHashMap

A

get(key) : returneaza valoarea asociata cu o cheie
contains(val) : verifica daca o valoare exista sau nu
containsKey(key) : verifica daca o cheie exista in map
put(key, val): adauga o valoare la cheia specificatta
putIfAbsent(key, val): adauga daca nu exista deja o valoare pt cheia aia
remove(key): sterge o asociere cheie valoare
replace(key, val) : modifica valoarea asociata cu o cheie

27
Q

Clasa BlockingQueue

A

practic ne ofera ArrayBlockingQueue, LinkedBlockingQueue şi PriorityBlockingQueue, doar ca thread safe.

Inserare :
arunca exceptie -> add(e)
valoare speciala -> offer(e)
se blocheaza-> put(e)
da timeout-> put(e, tine, unit)

stergere :
arunca exceptie -> remove()
valoare speciala -> poll()
se blocheaza-> take()
da timeout-> poll(time, unit)

examinare
arunca exceptie -> element()
valoare speciala -> peek()

28
Q

Collections.synchronized ?

A

Daca dorim sa lucram cu colectii clasice, atunci doar trebuie sa le instantiem folosind:

List<Integer> syncList = Collections.synchronizedList(new ArrayList<>());</Integer>

29
Q

Arbori concurenti ?

A

Daca e sa facem un arbore concurent ( foarte complicat ) atunci ar trebui ca fiecare nod sa aiba cate un lock, ci nu un lock global, astfel incat daca vreau sa schimb 2 valori simultan sa o pot face atata timp cat nu e la aceeasi adresa.

30
Q

Modelul Replicated workers + pseudocod si cand folosim?

A

e un design pattern : exista un pool de sarcini (o coada de task-uri) si un grup de workeri ( threads ).

while (1)
ia un task din pool
execută task-ul
adaugă zero sau mai multe task-uri rezultate în pool

E util atunci cand:
-Nu cunoastem dimensiunea problemei
-multe taskuri de dimensiuni mici fiind mai eficient refolosirea thread-urilor
-threadurile sunt dezechilibrate ( acum, cand unul termina, i se mai adauga in coada)

31
Q

ExecutorService Interface

A

o interfata care permite executarea taskurilor asincrone, in background, in mod concurent, pe baza modelului Replicated Wrokers.

cand instantiem un execturo service specificam nr de workeri
submit() : intoarce un task nou pt workeri