Sinhronizācija Java ir iespēja kontrolēt vairāku pavedienu piekļuvi jebkuram koplietotajam resursam.
Java sinhronizācija ir labāka iespēja, ja mēs vēlamies atļaut tikai vienam pavedienam piekļūt koplietotajam resursam.
Kāpēc izmantot sinhronizāciju?
Sinhronizācija galvenokārt tiek izmantota
- Lai novērstu pavedienu traucējumus.
- Lai novērstu konsekvences problēmu.
Sinhronizācijas veidi
Ir divi sinhronizācijas veidi
- Procesu sinhronizācija
- Pavedienu sinhronizācija
Šeit mēs apspriedīsim tikai pavedienu sinhronizāciju.
Pavedienu sinhronizācija
Ir divu veidu pavedienu sinhronizācijas savstarpēja izslēdzoša un starppavedienu komunikācija.
- Savstarpēja ekskluzīva
- Sinhronizēta metode.
- Sinhronizēts bloks.
- Statiskā sinhronizācija.
- Sadarbība (starppavedienu komunikācija Java)
Savstarpēja ekskluzīva
Savstarpēja ekskluzīva palīdz nodrošināt, lai pavedieni netraucētu viens otram datu koplietošanas laikā. To var panākt, izmantojot šādus trīs veidus:
- Izmantojot sinhronizēto metodi
- Izmantojot sinhronizēto bloku
- Izmantojot statisko sinhronizāciju
Bloķēšanas jēdziens Java valodā
Sinhronizācija ir balstīta uz iekšēju entītiju, kas pazīstama kā slēdzene vai monitors. Katram objektam ir saistīta slēdzene. Pēc vienošanās pavedienam, kuram nepieciešama konsekventa piekļuve objekta laukiem, ir jāiegūst objekta bloķēšana, pirms tiem piekļūt, un pēc tam jāatlaiž bloķēšana, kad tas ir paveikts.
No Java 5 pakotnē java.util.concurrent.locks ir vairākas bloķēšanas implementācijas.
Problēmas izpratne bez sinhronizācijas
Šajā piemērā nav sinhronizācijas, tāpēc izvade ir nekonsekventa. Apskatīsim piemēru:
TestSynchronization1.java
class Table{ void printTable(int n){//method not synchronized for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } class mythread1 extends thread{ table t; mythread1(table t){ this.t="t;" public void run(){ t.printtable(5); mythread2 mythread2(table t.printtable(100); testsynchronization1{ static main(string args[]){ obj="new" table(); only one object t1="new" mythread1(obj); t2="new" mythread2(obj); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 100 10 200 15 300 20 400 25 500 </pre> <h3>Java Synchronized Method</h3> <p>If you declare any method as synchronized, it is known as synchronized method.</p> <p>Synchronized method is used to lock an object for any shared resource.</p> <p>When a thread invokes a synchronized method, it automatically acquires the lock for that object and releases it when the thread completes its task.</p> <p> <strong>TestSynchronization2.java</strong> </p> <pre> //example of java synchronized method class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } class mythread1 extends thread{ table t; mythread1(table t){ this.t="t;" public void run(){ t.printtable(5); mythread2 mythread2(table t.printtable(100); testsynchronization2{ static main(string args[]){ obj="new" table(); only one object t1="new" mythread1(obj); t2="new" mythread2(obj); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <h3>Example of synchronized method by using annonymous class</h3> <p>In this program, we have created the two threads by using the anonymous class, so less coding is required.</p> <p> <strong>TestSynchronization3.java</strong> </p> <pre> //Program of synchronized method by using annonymous class class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } public class testsynchronization3{ static void main(string args[]){ final table obj="new" table(); only one object thread t1="new" thread(){ run(){ obj.printtable(5); }; t2="new" obj.printtable(100); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <hr></=5;i++){></pre></=5;i++){></pre></=5;i++){>
Java sinhronizētā metode
Ja kādu metodi deklarējat kā sinhronizētu, to sauc par sinhronizētu metodi.
Sinhronizētā metode tiek izmantota, lai bloķētu objektu jebkuram koplietotajam resursam.
Kad pavediens izsauc sinhronizētu metodi, tas automātiski iegūst šī objekta bloķēšanu un atbrīvo to, kad pavediens pabeidz savu uzdevumu.
TestSynchronization2.java
//example of java synchronized method class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } class mythread1 extends thread{ table t; mythread1(table t){ this.t="t;" public void run(){ t.printtable(5); mythread2 mythread2(table t.printtable(100); testsynchronization2{ static main(string args[]){ obj="new" table(); only one object t1="new" mythread1(obj); t2="new" mythread2(obj); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <h3>Example of synchronized method by using annonymous class</h3> <p>In this program, we have created the two threads by using the anonymous class, so less coding is required.</p> <p> <strong>TestSynchronization3.java</strong> </p> <pre> //Program of synchronized method by using annonymous class class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } public class testsynchronization3{ static void main(string args[]){ final table obj="new" table(); only one object thread t1="new" thread(){ run(){ obj.printtable(5); }; t2="new" obj.printtable(100); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <hr></=5;i++){></pre></=5;i++){>
Sinhronizētas metodes piemērs, izmantojot anonīmu klasi
Šajā programmā mēs esam izveidojuši divus pavedienus, izmantojot anonīmo klasi, tāpēc ir nepieciešams mazāk kodēšanas.
TestSynchronization3.java
//Program of synchronized method by using annonymous class class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } public class testsynchronization3{ static void main(string args[]){ final table obj="new" table(); only one object thread t1="new" thread(){ run(){ obj.printtable(5); }; t2="new" obj.printtable(100); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <hr></=5;i++){>
=5;i++){>=5;i++){>=5;i++){>