Răspunsuri la întrebările pentru interviu level27
Răspunsuri la întrebările pentru interviu Level27
1. Ce este un impas?
Impas - o situație în care două sau mai multe fire sunt blocate în așteptare pentru fiecare alte. Dedlock, de asemenea, numit impas.
Impas - o situație în care două sau mai multe procese de a lua unele resurse, încercarea de a obține alte resurse deținute de alte procese și nici un proces nu poate avea resursele de care au nevoie, și în consecință părăsească.
Există ordine de sincronizare inter-blochează (ordin rezolvat scop);
Interblocare între obiecte (obiecte diferite încearcă să acceseze aceleași blocuri sincronizate);
impas de resurse (atunci când încearcă să acceseze o parte din resursele care pot fi utilizate în același timp, doar un singur fir).
Metoda 5 așteptați recomandat pentru utilizare cu sau dacă în timp ce constructe?
Aici răspunsul pur și simplu citez din site-ul: www.skipy.ru/technics/synchronization.html
Despre asteptare așteptați. Este deja clar din echipamentul de descărcare. Recomandat pentru a apela aștepte în interiorul buclei în timp. Ie nu scrie
De ce este necesar. Faptul este că cauza poate sesiza oricine. Doar din greșeală, din care nimeni nu este imun. În acest caz, experiența pe care am vorbit mai devreme, am luat mizeria este pentru a se evita o astfel de posibilitate. Doar obiect pe care are loc sincronizarea ascunsă. Și accesul la el a fost doar codul nostru. Este o bună practică, dar nu este întotdeauna posibil, din păcate. Deci, în cazul în care firul este în așteptare pentru anumite condiții - în timp ce o variantă cu mai fiabile. În cazul în care debitul este admis din greșeală - verifică din nou starea și, dacă este necesar, va trebui să aștepte în continuare.
În plus, există o posibilitate și o simplă ieșire din regimul de așteptare, fără a anunța apelul. Eu sincer recunosc că nu am văzut acest lucru într-o specificație mașină virtuală, cu toate că în mod special în căutarea. Dar unele „guru“ susțin că VM poate ieși din așteptări spontane. Mai mult decât atât, se observă în mod periodic. Dacă cineva dă o legătură cu specificația corespunzătoare - Sunt recunoscător!
6 Ce se întâmplă după metoda de apel notifyAll?
Java.lang.Object.notifyAll () se trezește toate firele care așteaptă pe monitorul acestui obiect. Un fir așteaptă pe monitorul unui obiect prin apelarea una dintre metodele de așteptare.
Trezește toate firele care așteaptă pe acest monitor.
După instantierea ImmutablePoint modificarea acesteia nu este posibilă.
Cel mai simplu exemplu de clasă imuabile JDK este un șir. Orice metodă care suna pe o linie (de exemplu, description.toLowerCase ()) întoarce nou șir, și nu modifică originalul.
Exemplul clasa transformabil din JDK - Data. De exemplu, myDate.setHours (x) se modifică de exemplu myDate!
În cazul unor avantaje multi-threaded de programare ale claselor imuabile sunt evidente: după crearea de obiecte pot fi transmise altor fire, și ei vor fi întotdeauna la zi. Ie nu trebuie să verificați dacă data nu este o instanță a condiției și dacă celălalt fir său este modificat în timp ce lucrați cu el. De exemplu, aveți o metodă de proiect de lege (Data endDate), nu sunteți naivi pentru a verifica respectarea DatăDeÎncheiere unor condiții prealabile și să înceapă să lucreze cu ea. În acest moment, un alt fir se poate schimba endDate, de exemplu, instalați-l adânc în trecut. Consecințele pot fi cel mai uimitor.
8 Ce este un «thread-safe»?
Din nou:
stackoverflow.com/questions/6324085/
Fir în condiții de siguranță înseamnă că o metodă sau o clasă de exemplu, pot fi folosite de mai multe fire în același timp, fara probleme care apar.
Fluxul de securitate de stat implică faptul că o metodă sau o clasă pot fi folosite de mai multe fire fără a întâmpina probleme, adică impasuri.
Luați în considerare următoarea metodă:
Acum, firul A si firul B ambele ar dori să execute AddOne (). ci o începe mai întâi și citește valoarea Myint (0) în tmp. Acum, pentru un motiv oarecare planificatorul decide să oprească firul A și reportează la firul B. firul B acum se arată, de asemenea, valoarea Myint (încă 0) în propria lui tmp variabilă. Firul B termină întreaga metodă, astfel încât în final Myint = 1 și 1 este returnat. Acum este din nou rândul lui Subiect A. Un fir continuă. Și adaugă 1 la tmp (tmp a fost 0 pentru firul A). Și apoi salvează această valoare în Myint. Myint este din nou 1.
Aici si firul A si firul B dorește să efectueze o AddOne (). O primă dar începe Myint și citește valoarea (0) în PGT. Acum, pentru un motiv oarecare, planificatorul decide să oprească fluxul de A și a pus firului B. Fluxul este acum citește, de asemenea, Myint (0) valoarea în propria TMP variabilă. Firul B completează întreaga metodă, astfel încât, în final Myint = 1 și 1 este returnat. Un flux continuă. Adaugă 1 la TMP (TMP 0 pentru firele A). Și apoi stochează această valoare în Myint. Myint 1 din nou.
Deci, în acest caz AddOne metoda a fost numit de două ori, ci pentru că metoda nu a fost pusă în aplicare într-un mod sigur fir valoarea Myint nu este 2, așa cum era de așteptat, dar 1, deoarece al doilea fir citit Myint variabilă înainte de primul fir terminat actualizarea.
Deci, în această metodă caz AddOne a fost numit de două ori, dar din moment ce această metodă nu a fost pusă în aplicare într-un curent într-o valoare mod sigur Myint nu 2, așa cum era de așteptat, și 1, deoarece al doilea fir de lectură o variabilă Myint sa încheiat înainte de primul fir pentru actualizare.
Crearea de metode sigure de fire este foarte greu în cazuri non-triviale. Și există destul de multe tehnici. În Java puteți marca o metodă ca sincronizate, acest lucru înseamnă că doar un singur fir poate executa această metodă, la un moment dat. Celelalte fire să aștepte la coadă. Acest lucru face ca un fir de metodă sigură, dar dacă există o mulțime de lucru care urmează să fie făcută într-o metodă, apoi se risipește o mulțime de timp. O altă tehnică este „marca doar o mică parte a unei metode sincronizate“ prin crearea unui blocaj sau a unui semafor, și blocarea această mică parte (numită de obicei secțiunea critică). Există chiar unele metode care sunt puse în aplicare ca fir lockless în condiții de siguranță, ceea ce înseamnă că acestea sunt construite în așa fel încât mai multe fire pot cursa prin intermediul lor, în același timp, fără probleme vreodată cauzează, acest lucru poate fi cazul atunci când o metodă execută numai un singur apel atomic. Apeluri atomice sunt apelurile care nu pot fi întrerupte și se poate face numai de către un singur fir la un moment dat.
Crearea unui fir - metode sigure este foarte dificil. În Java, puteți marca o metodă sincronizată, aceasta ar însemna că doar un singur fir poate executa această metodă, în orice moment dat. Alte fire va aștepta în coada de așteptare. Acest lucru face ca metoda thread-safe, dar, în cazul în care o mulțime de muncă care urmează să fie făcut în metoda, atunci va lua o lungă perioadă de timp. O altă metodă constă în marcarea doar o mică parte a metodei sincronizate „prin crearea încuietori (încuietori) sau semafoarelor și blocare a porțiunii mici (numită de obicei secțiunea critică (secțiunea critică)). Există chiar unele metode care sunt puse în aplicare ca lockless fir-în condiții de siguranță (lockless fir în condiții de siguranță), aceasta înseamnă că acestea sunt proiectate astfel încât mai multe fire pot trece prin ele la un moment dat și nu cauzează o problemă, acesta poate fi cazul atunci când execută metoda doar un singur apel atomic. Apeluri atomice sunt apeluri care nu pot fi întrerupte, și pot fi puse în aplicare de către un singur fir.
ru.wikipedia.org/wiki/.0%9C.0%BE.0%B4.0%B5.0%BB.1%8C_.0%BF.0%B0.0%BC.1%8F.1 % 82,0% B8_Java
În special, unul executat înaintea celuilalt pentru astfel de tranzacții (lista nu este exhaustivă):
• Sincronizare și monitoare:
• Capture Monitor (timpurie sincronizat, metoda de blocare) și totul după ce, în același fir.
• Readuceți monitorul (sfârșitul sincronizate, metoda de deblocare), și tot ce este în fața lui, în același fir.
• Astfel, de optimizare poate intra într-un bloc de sincronizare linie, dar nu spre exterior.
• Readuceți monitorul și capturarea ulterioară a unui alt fir.
• Scrierea și citirea:
• Orice dependențe de date (adică orice intrare într-o variabilă și ulterior lectură aceeași) într-un singur flux.
• Tot ceea ce este în același fir înainte de a scrie la volatil variabilă, și înregistrarea în sine.
• volatil-citit și totul după ce, în același fir.
• înregistrarea volatile variabilă și apoi citirea este. [4] [2] Astfel, înregistrarea volatilă memorie face același lucru, că revenirea monitorului, și citirea - la fel ca și capturarea [5]. Acest lucru înseamnă că, în cazul în care un fir este înregistrat în volatile variabilă, iar al doilea este găsit, tot ce precede înregistrarea este realizată înainte ca tot ce vine după lectura; cm. ilustrare.
• Pentru variabilele obiect (de exemplu, volatile Listă x;) o astfel de garanție puternică sunt efectuate pentru o referință obiect, dar nu pentru conținutul său.
• Întreținere:
• static Inițializarea și orice acțiune cu orice instanță obiect.
• înregistrarea în finală câmpul din constructorul [6], si tot dupa constructor. Ca o excepție de la tranzitive generală, se întâmplă înainte de a-relație nu este tranzitiv în legătură cu alte reguli și, prin urmare, poate provoca cursa inter-thread. [7]
• Orice lucrare cu obiectul și finaliza ().
• Serviciul Debit:
• Structura alerga orice cod în flux.
• Dispariția variabilelor legate de fluxul, precum și orice cod în flux.
• în fluxul de cod și să se alăture (); flux de cod și isAlive () == false.
• întrerupere () și faptul de detectare de oprire a fluxului.
Regula numarul 1: programe pe un singur fir sunt executate psevdoposledovatelno. Acest lucru înseamnă, în realitate, procesorul poate efectua mai multe operații pe ciclu de ceas, în același timp, schimba ordinea lor, dar toate dependențele de date sunt, astfel încât comportamentul nu diferă de serial.
Regula numărul 2: nu există nicăieri care au luat valori. Citirea orice variabilă (cu excepția lungă non-volatilă și dublu, pentru care această regulă nu a putut fi efectuată) va da o valoare implicită (zero), sau ceva în scris cealaltă echipă.
Și Regula numărul 3: Restul evenimentelor sunt executate în ordine, dacă este legat prin ordin strict parțială „este executată înainte“ (în engleză se întâmplă înainte.).
3. Poate interblocare apar atunci când se utilizează metode de notificare, așteptați-?
Răspunsul este da, ei pot. Convențional, firul „primul“ poate aștepta până când se retrage din această stare fir „a doua“, care la rândul său este în așteptare până când se retrage din starea primului așteptare fir: de așteptare pentru unul de altul, și absolut nimic nu este nevoie să inventeze. Problema filosofilor de luat masa, propus de Edgar Dijkstra - tocmai în esența ei este o problemă de iluminare a originii interblocarea în contextul utilizării așteptați / notifica Acesta este un foarte bine scris și este disponibil în „filosofia Java» Eckel: capitolul 17, secțiunea 1.17.3
Principalul motiv pentru apel, așteptați și notifică o unitate statică sau o metodă care Java API necesită în mod necesar. Dacă apelați nu le sunt de bloc sincronizate, codul va arunca IllegalMonitorStateException. motiv mai viclean este de a evita starea cursa între apeluri, așteptați și notifică.
Impas - o situație în care două sau mai multe fire sunt blocate în așteptare pentru fiecare alte. Dedlock, de asemenea, numit impas. După ce a elaborat în mod corespunzător propunerea. mai degrabă aș fi scris că din impas - această fire de interblocare. Aceasta este o situație în care două sau mai multe fire blochează reciproc munca (sau de așteptare pentru fiecare alte să-și continue munca lor).
Mai multe despre opt capete de acuzare răspunde la unele mototolită și să îndepărteze pericolul. Subiect nu înseamnă neapărat că nu există impasuri (și, probabil, chiar contrariul). În același SCIP scris despre următoarele: obiectul thread-safe dacă orice metode ale obiectului poate fi apelată de fire fără a aduce atingere statutului său.
7 Care sunt beneficiile de la primirea obiectului, dacă este imuabil?
Un exemplu de un pic greșită. Clasa ImmutablePoint la această realizare ar trebui să facă finala (finala), pentru a evita posibilitatea de cădere pe un moștenitor „variabilă“. Acest punct este descris în Java eficientă 2nd Edition la articolul 15.