Ghid pentru sincronizare în Java
Publicat: 2022-10-23Înainte de a explica sincronizarea în Java , trebuie să revizuim pe scurt conceptul de multithreading. Caracteristica multithreading a Java permite executarea simultană a două sau mai multe părți ale unui program pentru utilizarea maximă a CPU. Fiecare parte a unui astfel de program este un fir, iar firele sunt procese ușoare din cadrul unui proces.
Acum, mai multe fire ale unui program pot încerca să acceseze aceleași resurse și să producă rezultate inexacte. Deci, trebuie să existe o anumită sincronizare pentru a se asigura că doar un fir are acces la resurse la un moment dat.
Consultați cursurile noastre gratuite de tehnologie pentru a obține un avantaj față de concurență.
Acest ghid despre ceea ce este sincronizarea în Java va explora conceptul de sincronizare în detaliu cu exemple.
Învață cursuri de dezvoltare software online de la cele mai bune universități din lume. Câștigați programe Executive PG, programe avansate de certificat sau programe de master pentru a vă accelera cariera.
Ce este sincronizarea în Java?
Sincronizarea Java este capacitatea de a controla accesul mai multor fire de execuție la o resursă partajată. Este util atunci când programele Java cu mai multe fire încearcă să acceseze aceeași resursă și să producă rezultate eronate. Folosind caracteristica de sincronizare Java, doar un singur fir poate ajunge la resursă la un moment dat.
Java oferă o modalitate de a sincroniza sarcina firelor de execuție folosind blocuri sincronizate care se sincronizează pe același obiect și pot avea doar un fir de execuție în interiorul lor odată. Aceste blocuri sunt marcate cu cuvântul cheie synchronized, blocând orice alt fir care încearcă să intre în blocul sincronizat până când firul aflat deja în bloc își încheie execuția și părăsește blocul.
Consultați Certificarea avansată upGrad în DevOps
Sintaxa pentru scrierea unui bloc sincronizat
Sintaxa generală pentru scrierea unui bloc sincronizat în Java este următoarea:
sincronizat( lockObject )
{
// instrucțiuni sincronizate
}
Explorați cursurile noastre populare de inginerie software
Master în Informatică de la LJMU și IIITB | Programul de certificat de securitate cibernetică Caltech CTME |
Bootcamp de dezvoltare completă | Programul PG în Blockchain |
Program Executive PG în Full Stack Development | |
Vezi mai jos toate cursurile noastre | |
Cursuri de Inginerie Software |
În sintaxa de mai sus, lockObject se referă la un obiect a cărui blocare este legată de elementele sincronizate. Acum, asta ne aduce la conceptul de blocare în Java.
Consultați Certificarea avansată în securitate cibernetică de la upGrad
Blocări în Java
Sincronizarea în Java este construită în jurul lacătului sau monitorului. Fiecare obiect are asociat o blocare. În mod ideal, un fir care necesită acces la câmpurile unui obiect trebuie să obțină mai întâi blocarea obiectului. Blocarea este un mecanism de sincronizare a firelor mai sofisticat și mai flexibil decât blocul de sincronizare. Este definit în pachetul java.util.concurrent.lock care conține implementări extinse de blocare.
Abilități de dezvoltare software la cerere
Cursuri JavaScript | Cursuri de bază Java | Cursuri de Structuri de Date |
Cursuri Node.js | Cursuri SQL | Cursuri de dezvoltare full stack |
Cursuri NFT | Cursuri DevOps | Cursuri de Big Data |
Cursuri React.js | Cursuri de securitate cibernetică | Cursuri de cloud computing |
Cursuri de proiectare baze de date | Cursuri Python | Cursuri de criptomonede |
Metoda sincronizată Java
Scopul unei metode sincronizate Java este de a bloca obiecte pentru resurse partajate. Astfel, atunci când firele de execuție invocă o metodă sincronizată, metoda primește automat blocarea pentru acel obiect și o eliberează odată ce firul de execuție își execută sarcina.
Iată un exemplu de metodă sincronizată Java:
//exemplu de metodă sincronizată java
Tabelul clasei{
sincronizat void printTable(int n){//metoda sincronizată
for(int i=1;i<=5;i++){
System.out.println(n*i);
încerca{
Thread.sleep(400);
}catch(Excepția e){System.out.println(e);}
}
}
}
clasa MyThread1 extinde Thread{
Tabelul t;
MyThread1(Tabelul t){
aceasta.t=t;
}
public void run(){
t.printTable(5);
}
}
clasa MyThread2 extinde Thread{
Tabelul t;
MyThread2(Tabelul t){
aceasta.t=t;
}
public void run(){
t.printTable(100);
}
}
clasa publică TestSynchronization2{
public static void main(String args[]){
Table obj = new Table();//doar un singur obiect
MyThread1 t1=new MyThread1(obj);
MyThread2 t2=new MyThread2(obj);
t1.start();
t2.start();
}
}
Citiți articolele noastre populare legate de dezvoltarea software
Cum se implementează abstracția datelor în Java? | Ce este Inner Class în Java? | Identificatori Java: definiție, sintaxă și exemple |
Înțelegerea încapsulării în OOPS cu exemple | Argumentele liniei de comandă în C explicate | Top 10 caracteristici și caracteristici ale cloud computing-ului în 2022 |
Polimorfismul în Java: concepte, tipuri, caracteristici și exemple | Pachete în Java și cum să le folosiți? | Tutorial Git pentru începători: Învață Git de la zero |
Ieșire:
5
10
15
20
25
100
200
300
400
500
Ce se întâmplă fără sincronizare?
Acum, să ne uităm la programul anterior fără sincronizare (rețineți absența cuvântului cheie sincronizat).
Tabelul clasei{
void printTable(int n){//metoda nu este sincronizată
for(int i=1;i<=5;i++){
System.out.println(n*i);
încerca{
Thread.sleep(400);
}catch(Excepția e){System.out.println(e);}
}
}
}
clasa MyThread1 extinde Thread{
Tabelul t;
MyThread1(Tabelul t){
aceasta.t=t;
}
public void run(){
t.printTable(5);
}
}
clasa MyThread2 extinde Thread{
Tabelul t;
MyThread2(Tabelul t){
aceasta.t=t;
}
public void run(){
t.printTable(100);
}
}
clasa TestSynchronization1{
public static void main(String args[]){
Table obj = new Table();//doar un singur obiect
MyThread1 t1=new MyThread1(obj);
MyThread2 t2=new MyThread2(obj);
t1.start();
t2.start();
}
}
Ieșire:
5
100
10
200
15
300
20
400
25
500
După cum puteți vedea, ieșirea este inconsecventă fără sincronizare.
Tipuri de sincronizare în Java
Pentru a răspunde la ce este sincronizarea firelor în Java , avem două tipuri de sincronizare disponibile: sincronizarea firelor și sincronizarea proceselor.
Să înțelegem ce înseamnă fiecare.
Sincronizarea firelor de execuție: Când mai multe fire de execuție încearcă să acceseze o resursă partajată, trebuie să ne asigurăm că resursa este utilizată de un singur fir la un moment dat. Sincronizarea firelor de execuție este procesul de a permite unui singur fir să utilizeze resursa partajată atunci când mai multe fire de execuție încearcă să utilizeze resursa simultan.
Sincronizarea proceselor: se referă la execuția simultană a mai multor procese pentru a ajunge la o stare în care procesele se angajează la o ordine adecvată de execuție. Sincronizarea proceselor este necesară atunci când două sau mai multe procese cooperează, iar execuția unui proces îl afectează pe celălalt. Astfel, sincronizarea proceselor elimină posibilitatea unor ieșiri inexacte și garantează ordinea de execuție corectă.
Metode de sincronizare în Java
În general, există patru metode de sincronizare în Java:
- Metode statice sincronizate
- Metode de instanță sincronizate
- Bloc sincronizat în cadrul metodelor statice
- Bloc sincronizat în interiorul metodelor de instanță
Să ne uităm la fiecare metodă de sincronizare Java mai detaliat.
Metode statice sincronizate
Aici, folosim cuvântul cheie sincronizat pentru a marca metodele statice în Java. Iată un exemplu de metodă statică sincronizată Java:
public static MyStaticCounter {
private static int count = 0;
public static sincronizat void increment(int value) {
numărare += valoare;
}
}
Metode de instanță sincronizate
Când utilizați un bloc sincronizat cu metode de instanță, fiecare obiect are metoda sa sincronizată. Fiecare obiect poate avea un singur fir care se poate executa în interiorul unei metode. Dacă există mai multe obiecte, se poate executa un singur fir pentru fiecare obiect din interiorul blocului.
clasă publică MyCounter {
private int count = 0;
public sincronizat void increment(int value) {
aceasta.număr += valoare;
}
public sincronizat void decrement(int value) {
this.count -= valoare;
}
}
Bloc sincronizat în cadrul metodelor statice
Mai jos este un exemplu în care folosim un bloc sincronizat în interiorul unei metode statice:
clasă publică MyClass {
public static void print(Mesaj șir) {
sincronizat(MyClass.class) {
log.writeln(mesaj);
}
}
}
Bloc sincronizat în interiorul metodelor de instanță
În loc să sincronizăm întreaga metodă, putem folosi sincronizat pe un anumit bloc din cadrul metodei. Mai jos este un exemplu de bloc de cod sincronizat în interiorul unei metode nesincronizate:
public void increment(int value) {
sincronizat(asta) {
aceasta.număr += valoare;
}
}
Nevoia de sincronizare în Java
Acum că știți ce este sincronizarea în Java , s-ar putea să vă întrebați de ce o folosim în primul rând.
Cuvântul cheie Java sincronizat oferă funcționalități esențiale pentru programarea concomitentă. Iată cum ajută sincronizarea în Java:
- Sincronizarea Java oferă caracteristica de blocare pentru a elimina orice condiție de concurență între fire și pentru a asigura accesul exclusiv exclusiv la resursa partajată.
- Blocarea sincronizată Java oferă atât funcțiile de blocare, cât și de deblocare. Deci, un fir trebuie să obțină blocarea înainte de a intra într-o metodă sau bloc sincronizat.
- Cuvântul cheie sincronizat împiedică reordonarea instrucțiunilor programului de către compilator.
Concluzie
În concluzie, sincronizarea în Java asigură că doar un fir poate accesa resursa partajată la un moment dat. Putem realiza un bloc sau o metodă sincronizată folosind cuvântul cheie Java synchronized. Când un fir vrea să intre într-un bloc sincronizat, trebuie să dobândească o blocare, iar după ce părăsește blocul, firul eliberează blocarea. Putem folosi cuvântul cheie sincronizat fie cu metode, fie în interiorul blocului unei metode.
Vrei să înveți conceptele de bază în Java? Cursul upGrad Executive Postuniversitar în Dezvoltare Software – Specializare în Dezvoltare Full Stack este un program online de 7 săptămâni pentru începătorii care doresc să exploreze carierele de dezvoltare de software. Participați la cursuri live și interactive, la sesiuni de practică și la peste 35 de ore de conținut oferit de liderii din industrie pentru a obține un certificat de absolvire de la upGrad.
Înscrieți-vă astăzi pentru a beneficia de avantajele exclusive upGrad ale asistenței studenților 24/7 și rețele din industrie!
De ce folosim sincronizat în Java?
Cuvântul cheie sincronizat din Java asigură că doar un fir poate accesa resursele partajate la un moment dat. Este util atunci când programele Java cu mai multe fire încearcă să acceseze aceeași resursă și să producă rezultate inexacte.
Cum este implementată sincronizarea în Java?
Java implementează sincronizarea folosind conceptul de monitoare cu un singur fir deținând un monitor la un moment dat. Când un fir de execuție obține o blocare, are acces la monitor și toate celelalte fire care încearcă să intre în monitorul blocat rămân blocate până când primul fir de execuție părăsește monitorul.
Ce este un blocaj în Java?
Deadlock Java apare atunci când un fir de execuție așteaptă o blocare a obiectului, dar un alt thread o dobândește, iar al doilea thread așteaptă o blocare a obiectului dobândită de primul. Prin urmare, ambele fire se așteaptă unul pe celălalt să elibereze blocarea, rezultând un blocaj.