Java'da senkronizasyon, birden fazla iş parçacığının herhangi bir paylaşılan kaynağa erişimini kontrol etme yeteneğidir.
Paylaşılan kaynağa yalnızca bir iş parçacığının erişmesine izin vermek istediğimizde Java Senkronizasyonu daha iyi bir seçenektir.
Senkronizasyonu neden kullanmalıyım?
Senkronizasyon esas olarak şu amaçlarla kullanılır:
- İplik girişimini önlemek için.
- Tutarlılık sorununu önlemek için.
Senkronizasyon Türleri
İki tür senkronizasyon vardır
- Süreç Senkronizasyonu
- Konu Senkronizasyonu
Burada yalnızca iş parçacığı senkronizasyonunu tartışacağız.
Konu Senkronizasyonu
İki tür iş parçacığı senkronizasyonu, karşılıklı dışlayıcı ve iş parçacıkları arası iletişim vardır.
- Karşılıklı Özel
- Senkronize yöntem.
- Senkronize blok.
- Statik senkronizasyon.
- İşbirliği (Java'da iş parçacıkları arası iletişim)
Karşılıklı Özel
Mutual Exclusive, veri paylaşırken iş parçacıklarının birbirine karışmasını önlemeye yardımcı olur. Aşağıdaki üç yolu kullanarak elde edilebilir:
- Senkronize Yöntem Kullanılarak
- Senkronize Blok Kullanarak
- Statik Senkronizasyon Kullanarak
Java'da Kilit Kavramı
Senkronizasyon, kilit veya monitör olarak bilinen dahili bir varlık etrafında oluşturulur. Her nesnenin kendisiyle ilişkilendirilmiş bir kilidi vardır. Geleneksel olarak, bir nesnenin alanlarına tutarlı erişime ihtiyaç duyan bir iş parçacığının, nesneye erişmeden önce nesnenin kilidini alması ve onlarla işi bittiğinde kilidi serbest bırakması gerekir.
Java 5'ten itibaren java.util.concurrent.locks paketi birkaç kilit uygulaması içerir.
Senkronizasyon olmadan sorunu anlama
Bu örnekte senkronizasyon olmadığından çıktı tutarsızdır. Örneğe bakalım:
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 Senkronize Yöntemi
Herhangi bir yöntemi senkronize olarak bildirirseniz, buna senkronize yöntem denir.
Senkronize yöntem, herhangi bir paylaşılan kaynak için bir nesneyi kilitlemek için kullanılır.
Bir iş parçacığı senkronize edilmiş bir yöntemi çağırdığında, o nesne için kilidi otomatik olarak alır ve iş parçacığı görevini tamamladığında onu serbest bırakır.
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++){>
Anonim sınıf kullanılarak senkronize yöntem örneği
Bu programda, anonim sınıfı kullanarak iki iş parçacığını oluşturduk, dolayısıyla daha az kodlama gerekiyor.
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++){>