Când începem două sau mai multe fire în cadrul unui program, poate exista o situație în care mai multe fire încearcă să acceseze o singură resursă și, în final, pot duce la un rezultat neașteptat din cauza unei probleme de concurrency. De exemplu, dacă mai multe fire încearcă să scrie în același fișier, atunci acestea pot duce la coruperea datelor, deoarece unul dintre fire poate denatura datele sau în timp ce un fir deschide același fișier, în același timp un alt fir poate închide unul și că același fișier.
Prin urmare, este necesar să se sincronizeze funcționarea mai multor fire și să se asigure că numai un fir poate accesa resursele la un moment dat. Acest lucru este realizat folosind un concept numit monitoare. Fiecare obiect din Java este asociat cu un monitor pe care firul îl poate bloca sau debloca. Numai un fir poate ține simultan o blocare pe monitor.
Limba de programare Java oferă o modalitate foarte convenabilă de a crea fire și de a sincroniza sarcinile folosind blocuri sincronizate. Păstrați resursele partajate în acest bloc. Următoarea este forma generală a instrucțiunii sincronizate:
Aici identificatorul obiectului este o referință la un obiect. a cărui blocare este asociată cu monitorul. care reprezintă o declarație sincronizată. Acum vom vedea două exemple în care vom imprima contorul folosind două fire diferite. Când firele nu sunt sincronizate, ele tipăresc valoarea contorului care nu este în secvență, dar când ieșim contorul prin plasarea lui în interiorul blocului sincron (), acesta imprimă un contor foarte mare în secvența pentru ambele fluxuri.
Exemplu multithreading fără sincronizare:
Iată un exemplu simplu care poate sau nu poate imprima valoarea contorului într-o secvență și de fiecare dată când o executăm produce un rezultat diferit în funcție de prezența procesorului în flux.
Acest lucru dă un rezultat diferit de fiecare dată când executați acest program:
Exemplu multithreading cu sincronizare:
Aici este același exemplu care imprimă valoarea contorului într-o secvență și de fiecare dată când executăm, produce același rezultat.
Acest lucru dă același rezultat de fiecare dată când executați acest program: