# Java âsynchronizedâ Anahtar Kelimesi > ###### Hatırlatmalar: > > - Kritik Bölge = Thread kullanılan uygulamalarda, paylaÅılan ve üzerinde iÅlem yapılabilen bellek bölgesine denir. > - YarıŠDurumu = Birden fazla threadin paylaÅılan bellek bölgesine aynı anda eriÅip aynı anda bellek bölgesinde iÅlem yapması durumudur. âCiritical Sectionâ olan kod bölgelerinde âRace Conditionâ durumuna engel olmak için kullanılabilecek yöntemlerden biri de âsynchronizedâ anahtar kelimesidir. Bu anahtar kelime ile âCritical Sectionâ kod bölgesi Threadâler arasında sıralı eriÅime açabilabilir. Kısaca sıralı eriÅim mantıÄı Åu Åekildedir. Kritik bölgeye ilk gelen thread iÅlem yaptıÄını belirtmek için bu bölgeyi kilitler. Bu sayede diÄer threadler içeride bir threadin iÅlem yaptıÄını anlarlar ve iÅlemin bitmesini bekleyebilirler. İÅlemi tamamlayan thread çıktıÄında kilit kaldırılır ve bekleyen threadler için tekrar iÅleme açılmıŠolur. İÅlem için bekleyen baÅka bir thread içeriye girdiÄinde tekrar kilit yapısını kullanarak eriÅim kısıtlaması yapar ve döngü halinde devam eder. Ãrnek vermek gerekirse; > Bir threadin bir dosyaya yazma iÅlemi yaptıÄı sırada bir baÅka threadin de aynı iÅlemi yapmak istemesi gibi büyük bir problem oluÅturacaktır. Böyle durumlarda kaynaÄa ilk ulaÅan threadin iÅini tamamlayıncaya kadar ilgili kaynaÄı kilit mekanizması ile eriÅime kapatılması daha sonra ise tekrar eriÅime açılması gerekir. ###### Metot içerisinde synchronized kullanımı: Bu yöntem genelde kodu baÅkası tarafından yazılan fakat üzerinde senkronizasyonu saÄlanmak istenilen durumlarda kullanılır. Böylelikle yönetime kısmen de olsa müdahale edilmiÅ olunur. ```java metot(){ synchronized(Lock objesi){ // kritik bölgede yapılacak iÅlemler } } ``` âsynchronizedâ anahtar kelimesi **bir deÄiÅkene, bir blok parçasına veya metoda** verilebilir. Yukarıdaki örnek Åimdi âThread Safeâ olarak yazılırsa; ```java public class QMatic implements Runnable { private int orderNo; private Object LOCK = new Object(); public QMatic() { this.orderNo = 0; } @Override public void run() { // a little bit delay to see race condition! ThreadSleeper.sleep(50); // Critical section for all threads! synchronized (LOCK) { this.orderNo = this.orderNo + 1; StringBuilder builder = new StringBuilder(); builder.append(Thread.currentThread().getName()); builder.append(" thread got "); builder.append(this.orderNo); builder.append(" from Qmatic!"); System.out.println(builder.toString()); } } } ``` QMatic isimli âRunnableâ interfaceâden türemiÅ sınıfta âLOCKâ isminde Object türünden bir kilit nesnesi oluÅturuluyor. Ardından âCritical Sectionâ olarak belirtilen tüm Threadâlerin ortak kullandıÄı âorderNoâ deÄiÅkeniyle iÅlem yapan kod bloÄunu âsynchronizedâ anahtar kelimesiyle korumaya alıp, Threadâler için sıralı eriÅime açılıyor. EÄer bir Thread âCritical Sectionâ olarak iÅaretlenen kod bloÄuna girip kaynakları kullanmaya baÅlarsa diÄer Threadâler o iÅini bitirene kadar beklemek zorundadırlar. ```java Thread-9 thread got 1 from Qmatic! Thread-1 thread got 2 from Qmatic! Thread-3 thread got 3 from Qmatic! Thread-7 thread got 4 from Qmatic! Thread-2 thread got 5 from Qmatic! Thread-4 thread got 6 from Qmatic! Thread-5 thread got 7 from Qmatic! Thread-0 thread got 8 from Qmatic! Thread-6 thread got 9 from Qmatic! Thread-8 thread got 10 from Qmatic! ``` ###### Senkronize Metotlar Bir sınıftaki herhangi bir metod synchronized ifadesini aldıÄı zaman o metoda bir thread girdiÄinde metodun bulunduÄu obje otomatikman olarak lock mekanizması ile eriÅime kapatılır. Bu durumda baÅka bir thread o sınıf içindeki hiçbir synchronized metoda eriÅemez. synchronized metod üzerinde iÅlem yapan thread metoddan çıktıÄı zaman ise lock kaldırılır ve tüm obje yeniden eriÅilebilir hale gelir. GörüleceÄi gibi "synchronized" yapısı metot içerisinde kullanıldıÄı gibi metodun kendisine de verilebilmektedir. Bu anahtar kelimenin yeri ise eriÅim belirtecinden sonra, fonksiyonun geri dönüŠtüründen önce olacak Åekilde araya yerleÅtirilmelidir. ```java erisim_belirtesi synchronized geri_dönüÅ_türü fonskiyon_adı(){ // yapılacak iÅlemler } ``` Yukarıda âsynchronizedâ olarak belirttiÄimiz kod bloÄu bir metod içine alınırsa aÅaÄıdaki gibi yapabilir. ```java private synchronized void increment() { this.orderNo = this.orderNo + 1; StringBuilder builder = new StringBuilder(); builder.append(Thread.currentThread().getName()); builder.append(" thread got "); builder.append(this.orderNo); builder.append(" from Qmatic!"); System.out.println(builder.toString()); } ``` **Kaynaklar** - https://medium.com/s%C4%B1f%C4%B1rdan-i%CC%87leri-d%C3%BCzeye-java-e%C4%9Fitim-serisi/multithreaded-programlama-1-k%C4%B1s%C4%B1m-40904a219a18 - Ãneri Kaynak: https://huseyin-karabakla.medium.com/