Mecanisme de Sincronizare. n aceast lucrare vor fi prezentate mecanismele Java pentru programarea concurent. Fire de Execuie Exist dou moduri n care pot fi create noi fire de execuie n Java. Primul mod const n crearea unei subclase a clasei Thread i suprascrierea metodei run!". Pentru fiecare fir de execuie pe care dorim s#l rulm trebuie s crem un exemplar din noua clas i s#l lansm apel$nd metoda start!" a noului exemplar% public class &irThread extends Thread ' public void run!"'((aceasta este metoda care se execut concurent )hile!true" *+stem.out.println!,-ar eu sunt un firicel,". / public static void main!*tring01 arg"' &irThread f2ne) &irThread!". f.start!".((pornim run#ul lui f )hile!true" *+stem.out.println!,eu sunt firul principal,". / /
3eoarece n Java nu avem motenire multipl mecanismul anterior nu poate fi folosit ntotdeauna. 3e aceea mai avem un mod de creare a unui nou fir de execuie% crearea unei noi clase care s implementeze interfaa 4unnable5 noua clas trebuind s implementeze metoda run!". Pentru a porni un nou fir de execuie se creeaz un exemplar din noua clas care va fi pasat ca parametru la crearea unui obiect din clasa Thread. &irul se lanseaz n acelai mod5 apel$nd metoda start a noului obiect Thread. public class &ir4unnable implements 4unnable ' (66 7reates ne) &ir4unnable 6( public void run!"'((firul care se execut concurent )hile!true" *+stem.out.println!,-ar eu sunt un firicel,". / public static void main!*tring01 arg"' &ir4unnable f2ne) &ir4unnable!".((exemplarul care trebuie pasat firului ne) Thread!f".start!".((crem firul i#l pornim )hile!true" *+stem.out.println!,eu sunt firul principal,". / / &iecare fir de execuie are o prioritate5 care este un numr din intervalul 08-9:P4-;4-T<58=>:P4-;4-T<1 i care poate fi modificat cu a?utorul metodei% public final void setPriority!int ne)Priorit+" n general5 atunci c$nd exist o competiie pentru resurse sunt preferate firele care au prioritate mai mare dar nu exist nici o garanie n acest sens5 i nici c firul cu prioritatea cea mai mare va fi mereu n execuie. 3eci nu acesta va fi mecanismul care va fi folosit pentru definirea zonelor critice. @n fir poate fi setat ca fiind demon5 nainte de lansarea sa n execuie5 folosind metoda% public final void setDaemon!boolean on" ; aplicaie ?ava ruleaz p$n c$nd% *e execut cu succes metoda exit!" a clasei 4untime. Ai#au terminat execuia toate firele nemarcate ca fiind demon. &irele pot fi grupate folosind obiecte din clasa ThreadBroup5 prin folosirea unui constructor adecvat. @n grup poate s includ alte grupuri5 acestea av$nd o structur arborescent5 relaiile ntre grupuri fiind de genul printe#copil. @n fir poate avea acces la informaiile legate de propriul grup5 dar nu la informaiile legate de alte grupuri5 aici incluz$ndu#se i printele. 3ac nu se specific un anumit grup la crearea obiectului din clasa Thread5 acesta va fi considerat ca fc$nd parte din grupul implicit. Mecanisme de Sincronizare 1 7ea mai simpl metod de sincronizare const n folosirea unei metode ?oin% C. public final void ?oin!" thro)s -nterruptedException D. public final void ?oin!long millis" thro)s -nterruptedException E. public final void ?oin!long millis5 int nanos" thro)s -nterruptedException Prima metod ateapt terminarea respectivului fir de execuie5 a doua ateapt cel mult millis milisecunde iar cea de#a treia mai ateapt i nanos nanosecunde. 3ac firul a fost ntrerupt de un altul este aruncat o excepie -nterruptedException5 dup care fanionul corespunztor este resetat. @n exemplu de utilizare al acestei metode este urmtorul5 care adun elementele unui vector% (6 6 adFector.?ava 6 6 7reated on GC aprilie DGGD5 CH%CI 6( (66 6 6 Jauthor st 6 Jversion 6( public class adFector extends Thread ' static int v012ne) int0CGG1.((vectorul pe care l adunm static int rez012ne) int0H1.((aici memorm rezultatele produse de fire private int index.((indexul firului de execuie (66 7reates ne) adFector 6( public adFector!int numar" '((iniializm indexul firului de execuie index2numar. / public void run!"((asta#i firul ' int i. rez0index12G. C n aceast lucrare este prezentat un rezumat. Pentru o descriere exhaustiv v recomand Java Kanguage *pecification5 cel puin% L.E.C.H volatile &ields L.H.E.M s+nchronized 8ethods CH.CL The s+nchronized *tatement CN Threads and KocOs for!i2index6DP.iQ!indexRC"6DP.iRR"((algoritm clasic dar nu lucreaz dec$t cu o parte din rez0index1R2v0i1. ((vector / (66 6 Jparam args the command line arguments 6( public static void main !*tring args01" ' int i. for!i2G.iQCGG.iRR"((iniializm vectorul v0i12iRC. adFector fire012ne) adFector0H1. for!i2G.iQH.iRR" fire0i12ne) adFector!i". ((crem cele patru fire de execuie for!i2G.iQH.iRR" fire0i1.start!".((le pornim int suma2G. for!i2G.iQH.iRR"((adunm rezultatele produse de fire ' tr+' fire0i1.?oin!".((ateptm s moar firul i / catch!-nterruptedException ie" '/ sumaR2rez0i1.((adunm / *+stem.out.println!suma". / / &iecare fir de execuie pstreaz o copie de lucru pentru fiecare variabil cu care lucreaz5 variabilele fiind parta?ate n memoria principal. n timpul execuiei unui fir5 acesta opereaz asupra acestor copii de lucru5 memorate n memoria de S lucru. 7el mai simplu mod n care se poate obine o sincronizare ntre memoria de lucru i memoria principal const n declararea unei variabile ca fiind volatile D . n cazul unei variabile declarate ca fiind volatile firul de execuie trebuie s#i armonizeze copia de lucru cu copia principal de fiecare dat c$nd acceseaz variabila. n plus5 operaiile efectuate n memoria principal n numele unui fir asupra uneia sau a mai multor variabile volatile sunt executate n aceeai ordine n care le#a cerut firul de execuie. @n mecanism mai sigur de sincronizare este dat de folosirea s+nchronized. ; metod declarat s+nchronized nu se va executa dec$t atunci c$nd firul respectiv este ,proprietarul, obiectului asociat metodei5 la final obiectul fiind eliberat. n cazul unei D =celai specificator este prezent i n 75 dar funcionalitatea acestuia este asigurat de compilator5 ceea ce face ca mecanismul s nu fie prea sigur n cazul n care exist mai multe procesoare. metode nestatice5 se ncearc blocarea exemplarului a crui metod sincronizat este apelat. n cazul unei metode statice5 se ncearc blocarea obiectului 7lass. 8ecanismul este similar cu cel al mutexului5 dei este de fapt o extensie a monitorului. Exemplu% class Test ' int count. s+nchronized void bump!" ' countRR. / static int class7ount. static s+nchronized void classTump!" ' class7ountRR. / /
=ceeai semnificaie se poate obine folosind instruciunea synchronized% class TumpTest ' int count. void bump!" ' s+nchronized !this" ' countRR. / / static int class7ount. static void classTump!" ' tr+ ' s+nchronized !7lass.for9ame!,TumpTest,"" ' class7ountRR. / / catch !7lass9ot&oundException e" ' ... / / / n cazul unei instruciuni de genul% s+nchronized ( Expression ) Block mai nt$i se evalueaz expresia care trebuie s aib ca rezultat o referin non#nul5 dup care se ateapt blocarea obiectului coninut de referin5 put$ndu#se apoi trece la execuia blocului de instruciuni5 iar n final se efectueaz deblocarea. 3eoarece acest mecanism nu este suficient5 n clasa ;b?ect avem c$teva metode care pot fi folosite pentru sincronizare% C. public final void )ait!" thro)s -nterruptedException D. public final void )ait!long timeout" thro)s -nterruptedException E. public final void )ait!long timeout5 int nanos" thro)s -nterruptedException H. public final void notif+!" P. public final void notif+=ll!" 8etodele )ait fac ca firul apelant s atepte p$n c$nd un alt fir apeleaz metoda notif+!" sau notif+=ll!" pentru acelai obiect sau5 dup caz5 a expirat timpul specificat. &irul apelant al acestor metode trebuie s fie proprietarul monitorului obiectului cruia i se apeleaz metoda )ait. &irul elibereaz monitorul i ateapt s fie notificat sau expirarea timpului dup care ateapt reblocarea monitorului nainte de a continua execuia. 8etoda notif+!" ,trezete, cel mult un fir5 aleg$ndu#l n mod arbitrar atunci c$nd sunt mai multe cele care ateapt dup acelai obiect. 3ac dorii s le deblocai pe toate5 folosii metoda notif+=ll!". 8ecanismul este similar cu variabilele condiie de la Kinux5 de aceea )ait poate fi folosit ntr#un context similar cu urmtorul% s+nchronized!exemplar"' S. exemplar.)ait!". S / Probleme Propuse. C. * se determine dac un element apare ntr#un vector oarecare5 folosind n procesoare. D. * se determine pe ce poziii apare un element ntr#un vector oarecare5 folosind n procesoare. E. ; resurs poate fi utilizat de dou tipuri de procese% albe i negre. =tunci c$nd resursa este folosit de procese albe ea nu mai poate fi folosit de procese negre. Este valabil i reciproca. * se implementeze accesul la resurs5 evit$ndu#se nfometarea. H. * se sorteze elementele unui vector cu n procesoare. P. * se genereze toate numerele prime mai mici dec$t o anumit valoare5 folosind n procesoare. M. * se coordoneze semafoarele de la captul unui tunel cu o singur band5 folosindu#se de senzorii de la fiecare capete care semnalizeaz intrarea i ieirea mainilor5 astfel nc$t s nu se permit intrarea pe la un capt c$t timp mai sunt maini n tunel merg$nd n sens invers. 8ainile s fie simulate cu a?utorul firelor de execuie.