{"id":35296,"date":"2025-11-28T01:40:52","date_gmt":"2025-11-27T22:40:52","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35296"},"modified":"2025-11-28T01:40:52","modified_gmt":"2025-11-27T22:40:52","slug":"javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/","title":{"rendered":"Java&#8217;da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi"},"content":{"rendered":"<p><body><\/p>\n<h2>Java&#8217;da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi<\/h2>\n<p>\u00c7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 (multi-threading) programlama, modern uygulamalar\u0131n performans\u0131n\u0131 ve yan\u0131t verebilirli\u011fini art\u0131rmak i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. Ancak, birden fazla i\u015f par\u00e7ac\u0131\u011f\u0131 ayn\u0131 anda payla\u015f\u0131lan kaynaklara eri\u015fmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, veri tutars\u0131zl\u0131klar\u0131 ve yar\u0131\u015f ko\u015fullar\u0131 (race conditions) gibi ciddi sorunlar ortaya \u00e7\u0131kabilir. Bu sorunlar\u0131 \u00f6nlemek ve i\u015f par\u00e7ac\u0131\u011f\u0131 g\u00fcvenli\u011fini (thread safety) sa\u011flamak i\u00e7in senkronizasyon mekanizmalar\u0131na ihtiya\u00e7 duyar\u0131z. Java, bu ama\u00e7la <code>synchronized<\/code> anahtar kelimesini sunar, ancak bazen daha esnek ve kontrol edilebilir senkronizasyon ara\u00e7lar\u0131na ihtiya\u00e7 duyulur. \u0130\u015fte bu noktada <code>java.util.concurrent.locks<\/code> paketi ve \u00f6zellikle de <code>ReentrantLock<\/code> s\u0131n\u0131f\u0131 devreye girer. Bu makalede, <code>ReentrantLock<\/code>&#8216;\u0131n ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, <code>synchronized<\/code> anahtar kelimesinden farklar\u0131n\u0131 ve \u00e7e\u015fitli kullan\u0131m senaryolar\u0131n\u0131 ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Giri\u015f: \u00c7oklu \u0130\u015f Par\u00e7ac\u0131\u011f\u0131 Programlamada Senkronizasyon \u0130htiyac\u0131<\/h3>\n<p>Java&#8217;da \u00e7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 uygulamalar\u0131 geli\u015ftirirken, birden fazla i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n ayn\u0131 anda bir nesnenin durumunu de\u011fi\u015ftirmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarla s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131l\u0131r. \u00d6rne\u011fin, birden fazla i\u015f par\u00e7ac\u0131\u011f\u0131 ortak bir saya\u00e7 de\u011fi\u015fkenini art\u0131r\u0131yor veya ortak bir veri yap\u0131s\u0131na (liste, harita vb.) \u00f6\u011fe ekleyip \u00e7\u0131kar\u0131yorsa, bu i\u015flemler atomik (b\u00f6l\u00fcnmez) olmad\u0131\u011f\u0131nda beklenmedik sonu\u00e7lar ortaya \u00e7\u0131kabilir. Bu duruma yar\u0131\u015f ko\u015fulu denir. Yar\u0131\u015f ko\u015fullar\u0131, program\u0131n davran\u0131\u015f\u0131n\u0131 \u00f6ng\u00f6r\u00fclemez hale getirir ve hata ay\u0131klamay\u0131 son derece zorla\u015ft\u0131r\u0131r.<\/p>\n<p>Java&#8217;n\u0131n <code>synchronized<\/code> anahtar kelimesi, bu t\u00fcr sorunlar\u0131 \u00e7\u00f6zmek i\u00e7in temel bir mekanizma sunar. Bir metodu veya kod blo\u011funu <code>synchronized<\/code> olarak i\u015faretledi\u011finizde, ayn\u0131 anda yaln\u0131zca bir i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n o senkronize edilmi\u015f koda eri\u015fmesine izin verilir. Di\u011fer i\u015f par\u00e7ac\u0131klar\u0131, kilit serbest b\u0131rak\u0131lana kadar beklemeye al\u0131n\u0131r. Bu, basit senkronizasyon ihtiya\u00e7lar\u0131 i\u00e7in olduk\u00e7a etkili ve kullan\u0131m\u0131 kolay bir \u00e7\u00f6z\u00fcmd\u00fcr. Ancak <code>synchronized<\/code>&#8216;\u0131n baz\u0131 s\u0131n\u0131rlamalar\u0131 vard\u0131r:<\/p>\n<p>*   <strong>Esneklik Eksikli\u011fi:<\/strong> Kilidin ne zaman al\u0131naca\u011f\u0131n\u0131 ve ne zaman serbest b\u0131rak\u0131laca\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a kontrol edemezsiniz. Kilit, senkronize edilmi\u015f blo\u011fun sonuna ula\u015f\u0131ld\u0131\u011f\u0131nda veya bir istisna f\u0131rlat\u0131ld\u0131\u011f\u0131nda otomatik olarak serbest b\u0131rak\u0131l\u0131r.<br \/>\n*   <strong>Kilidi Deneme Yetene\u011fi Yok:<\/strong> Bir i\u015f par\u00e7ac\u0131\u011f\u0131, kilidi hemen alam\u0131yorsa, sonsuza kadar beklemek yerine ba\u015fka bir i\u015f yapmaya devam edemez. <code>synchronized<\/code> ile kilidi almaya \u00e7al\u0131\u015fmak bloke edici bir i\u015flemdir.<br \/>\n*   <strong>Kesintiye U\u011frayabilen Kilit Beklemesi Yok:<\/strong> Bir i\u015f par\u00e7ac\u0131\u011f\u0131 <code>synchronized<\/code> bir blo\u011fa girmek i\u00e7in beklerken, d\u0131\u015far\u0131dan gelen bir kesinti sinyali ile bu bekleme durumundan \u00e7\u0131kamaz.<br \/>\n*   <strong>\u00c7oklu Ko\u015ful De\u011fi\u015fkeni Yok:<\/strong> <code>Object.wait()<\/code>, <code>notify()<\/code> ve <code>notifyAll()<\/code> metotlar\u0131, belirli bir nesneyle ili\u015fkilidir ve yaln\u0131zca tek bir bekleme k\u00fcmesini y\u00f6netebilir. Daha karma\u015f\u0131k senaryolarda birden fazla bekleme ko\u015fuluna ihtiya\u00e7 duyuldu\u011funda bu yetersiz kalabilir.<br \/>\n*   <strong>Adillik (Fairness) Yok:<\/strong> <code>synchronized<\/code> kilitlerin adil olup olmad\u0131\u011f\u0131 garanti edilmez; yani, kilidi bekleyen i\u015f par\u00e7ac\u0131klar\u0131 aras\u0131nda bir \u00f6ncelik s\u0131ras\u0131 yoktur.<\/p>\n<p>Bu s\u0131n\u0131rlamalar, \u00f6zellikle y\u00fcksek performansl\u0131 ve karma\u015f\u0131k e\u015fzamanl\u0131 uygulamalar geli\u015ftirirken geli\u015ftiricilere ek zorluklar \u00e7\u0131kar\u0131r. <code>java.util.concurrent.locks<\/code> paketi, bu eksiklikleri gidermek ve daha geli\u015fmi\u015f senkronizasyon kontrol\u00fc sa\u011flamak amac\u0131yla tasarlanm\u0131\u015ft\u0131r.<\/p>\n<h3>Lock Aray\u00fcz\u00fc: <code>synchronized<\/code>&#8216;a Alternatif ve Daha Fazlas\u0131<\/h3>\n<p><code>java.util.concurrent.locks.Lock<\/code> aray\u00fcz\u00fc, <code>synchronized<\/code> anahtar kelimesine k\u0131yasla daha esnek ve g\u00fc\u00e7l\u00fc bir kilit mekanizmas\u0131 sunar. Bu aray\u00fcz, geli\u015ftiricilere kilit edinme ve serbest b\u0131rakma s\u00fcre\u00e7leri \u00fczerinde daha fazla kontrol sa\u011flar. <code>Lock<\/code> aray\u00fcz\u00fcn\u00fcn temel metotlar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <code>void lock()<\/code>: Kilidi edinir. Kilit ba\u015fka bir i\u015f par\u00e7ac\u0131\u011f\u0131 taraf\u0131ndan tutuluyorsa, bu metodu \u00e7a\u011f\u0131ran i\u015f par\u00e7ac\u0131\u011f\u0131 kilit serbest b\u0131rak\u0131lana kadar bloke olur.<br \/>\n*   <code>void lockInterruptibly() throws InterruptedException<\/code>: Kilidi edinir, ancak kilidi beklerken i\u015f par\u00e7ac\u0131\u011f\u0131 kesintiye u\u011frayabilir. E\u011fer i\u015f par\u00e7ac\u0131\u011f\u0131 kesintiye u\u011frarsa, <code>InterruptedException<\/code> f\u0131rlat\u0131r.<br \/>\n*   <code>boolean tryLock()<\/code>: Kilidi edinmeye \u00e7al\u0131\u015f\u0131r. Kilit m\u00fcsaitse hemen edinir ve <code>true<\/code> d\u00f6nd\u00fcr\u00fcr. Kilit m\u00fcsait de\u011filse, bloke olmadan hemen <code>false<\/code> d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <code>boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException<\/code>: Belirtilen zaman a\u015f\u0131m\u0131 s\u00fcresi boyunca kilidi edinmeye \u00e7al\u0131\u015f\u0131r. E\u011fer kilit bu s\u00fcre i\u00e7inde edinilirse <code>true<\/code>, edinilemezse <code>false<\/code> d\u00f6nd\u00fcr\u00fcr. Kilit beklerken i\u015f par\u00e7ac\u0131\u011f\u0131 kesintiye u\u011frayabilir.<br \/>\n*   <code>void unlock()<\/code>: Kilidi serbest b\u0131rak\u0131r. Bu metot, kilidi edinmi\u015f olan i\u015f par\u00e7ac\u0131\u011f\u0131 taraf\u0131ndan \u00e7a\u011fr\u0131lmal\u0131d\u0131r. Aksi takdirde <code>IllegalMonitorStateException<\/code> f\u0131rlat\u0131labilir.<\/p>\n<p><code>Lock<\/code> aray\u00fcz\u00fcn\u00fc kullan\u0131rken en kritik noktalardan biri, kilidi her zaman bir <code>finally<\/code> blo\u011fu i\u00e7inde serbest b\u0131rakmakt\u0131r. Bu, senkronize edilmi\u015f kod blo\u011funda bir istisna olu\u015fsa bile kilidin serbest b\u0131rak\u0131lmas\u0131n\u0131 garanti eder ve di\u011fer i\u015f par\u00e7ac\u0131klar\u0131n\u0131n kilitlenmesini (deadlock) \u00f6nler.<\/p>\n<pre><code class=\"language-java\">import java.util.concurrent.locks.Lock;\nimport java.util.concurrent.locks.ReentrantLock;\n\npublic class LockOrnegi {\n    private final Lock kilit = new ReentrantLock();\n    private int sayac = 0;\n\n    public void artir() {\n        kilit.lock(); \/\/ Kilidi edin\n        try {\n            \/\/ Senkronize edilmi\u015f kod blo\u011fu\n            sayac++;\n            System.out.println(Thread.currentThread().getName() + \" sayac\u0131 art\u0131rd\u0131: \" + sayac);\n        } finally {\n            kilit.unlock(); \/\/ Kilidi serbest b\u0131rak\n        }\n    }\n\n    public int getSayac() {\n        return sayac;\n    }\n\n    public static void main(String[] args) throws InterruptedException {\n        LockOrnegi ornek = new LockOrnegi();\n\n        Runnable gorev = () -> {\n            for (int i = 0; i < 1000; i++) {\n                ornek.artir();\n            }\n        };\n\n        Thread t1 = new Thread(gorev, \"Thread-1\");\n        Thread t2 = new Thread(gorev, \"Thread-2\");\n\n        t1.start();\n        t2.start();\n\n        t1.join();\n        t2.join();\n\n        System.out.println(\"Nihai Saya\u00e7 De\u011feri: \" + ornek.getSayac());\n    }\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>ReentrantLock<\/code> s\u0131n\u0131f\u0131 <code>Lock<\/code> aray\u00fcz\u00fcn\u00fcn bir implementasyonudur. <code>artir()<\/code> metodu, <code>lock()<\/code> ile kilidi edinir ve <code>finally<\/code> blo\u011fu i\u00e7inde <code>unlock()<\/code> ile serbest b\u0131rak\u0131r. Bu yap\u0131, <code>synchronized<\/code> anahtar kelimesinin sa\u011flad\u0131\u011f\u0131 g\u00fcvenli\u011fi, daha a\u00e7\u0131k bir kontrol mekanizmas\u0131yla sunar.<\/p>\n<h3>ReentrantLock Nedir? Detayl\u0131 Bak\u0131\u015f<\/h3>\n<p><code>ReentrantLock<\/code>, <code>Lock<\/code> aray\u00fcz\u00fcn\u00fcn en yayg\u0131n kullan\u0131lan implementasyonlar\u0131ndan biridir. Ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, \"reentrant\" (yeniden giri\u015fli) bir kilittir. Peki, bu ne anlama geliyor?<\/p>\n<h4>Yeniden Giri\u015flilik (Reentrancy) Kavram\u0131<\/h4>\n<p>Bir i\u015f par\u00e7ac\u0131\u011f\u0131, zaten sahip oldu\u011fu bir <code>ReentrantLock<\/code> kilidini tekrar edinebilir. \u00d6rne\u011fin, bir i\u015f par\u00e7ac\u0131\u011f\u0131 <code>lock()<\/code> metodunu \u00e7a\u011f\u0131rarak bir kilidi edindikten sonra, ayn\u0131 i\u015f par\u00e7ac\u0131\u011f\u0131 ayn\u0131 kilit \u00fczerinde tekrar <code>lock()<\/code> metodunu \u00e7a\u011f\u0131rabilir ve kilit ba\u015far\u0131l\u0131 bir \u015fekilde edinilir. Kilidin \"tutma say\u0131s\u0131\" (hold count) art\u0131r\u0131l\u0131r. Kilidin tamamen serbest b\u0131rak\u0131lmas\u0131 i\u00e7in, <code>lock()<\/code> \u00e7a\u011fr\u0131s\u0131 kadar <code>unlock()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131n yap\u0131lmas\u0131 gerekir.<\/p>\n<p>Bu \u00f6zellik, i\u00e7 i\u00e7e metot \u00e7a\u011fr\u0131lar\u0131nda veya \u00f6zyinelemeli (recursive) metotlarda olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r. E\u011fer bir i\u015f par\u00e7ac\u0131\u011f\u0131, bir kilit alt\u0131nda \u00e7al\u0131\u015fan bir metottan, yine ayn\u0131 kilidi gerektiren ba\u015fka bir metodu \u00e7a\u011f\u0131r\u0131rsa, yeniden giri\u015flilik sayesinde i\u015f par\u00e7ac\u0131\u011f\u0131 kendisini bloke etmez.<\/p>\n<h4>\u0130\u00e7 \u00c7al\u0131\u015fma Prensibi (Kavramsal)<\/h4>\n<p><code>ReentrantLock<\/code>, i\u00e7sel olarak kilidin hangi i\u015f par\u00e7ac\u0131\u011f\u0131 taraf\u0131ndan tutuldu\u011funu ve bu i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n kilidi ka\u00e7 kez edindi\u011fini takip eden bir saya\u00e7 (hold count) tutar.<\/p>\n<p>*   Bir i\u015f par\u00e7ac\u0131\u011f\u0131 <code>lock()<\/code> metodunu \u00e7a\u011f\u0131rd\u0131\u011f\u0131nda:<br \/>\n    *   E\u011fer kilit serbestse, i\u015f par\u00e7ac\u0131\u011f\u0131 kilidin sahibi olur ve tutma say\u0131s\u0131 1 olarak ayarlan\u0131r.<br \/>\n    *   E\u011fer kilit zaten bu i\u015f par\u00e7ac\u0131\u011f\u0131 taraf\u0131ndan tutuluyorsa, tutma say\u0131s\u0131 art\u0131r\u0131l\u0131r.<br \/>\n    *   E\u011fer kilit ba\u015fka bir i\u015f par\u00e7ac\u0131\u011f\u0131 taraf\u0131ndan tutuluyorsa, \u00e7a\u011f\u0131ran i\u015f par\u00e7ac\u0131\u011f\u0131 kilit serbest b\u0131rak\u0131lana kadar bloke olur.<br \/>\n*   Bir i\u015f par\u00e7ac\u0131\u011f\u0131 <code>unlock()<\/code> metodunu \u00e7a\u011f\u0131rd\u0131\u011f\u0131nda:<br \/>\n    *   E\u011fer \u00e7a\u011f\u0131ran i\u015f par\u00e7ac\u0131\u011f\u0131 kilidin sahibi de\u011filse, <code>IllegalMonitorStateException<\/code> f\u0131rlat\u0131l\u0131r.<br \/>\n    *   E\u011fer \u00e7a\u011f\u0131ran i\u015f par\u00e7ac\u0131\u011f\u0131 kilidin sahibi ise, tutma say\u0131s\u0131 azalt\u0131l\u0131r.<br \/>\n    *   E\u011fer tutma say\u0131s\u0131 s\u0131f\u0131ra d\u00fc\u015ferse, kilit serbest b\u0131rak\u0131l\u0131r ve bekleyen di\u011fer i\u015f par\u00e7ac\u0131klar\u0131ndan biri kilidi edinebilir.<\/p>\n<h4>Kurucular ve Adillik (Fairness)<\/h4>\n<p><code>ReentrantLock<\/code> s\u0131n\u0131f\u0131n\u0131n iki kurucusu vard\u0131r:<\/p>\n<p>1.  <code>ReentrantLock()<\/code>: Varsay\u0131lan olarak \"adil olmayan\" (non-fair) bir kilit olu\u015fturur.<br \/>\n2.  <code>ReentrantLock(boolean fair)<\/code>: <code>fair<\/code> parametresi <code>true<\/code> ise adil bir kilit, <code>false<\/code> ise adil olmayan bir kilit olu\u015fturur.<\/p>\n<h5>Adil Kilit (Fair Lock)<\/h5>\n<p>Adil bir kilit, kilidi bekleyen i\u015f par\u00e7ac\u0131klar\u0131na, kilit i\u00e7in beklemeye ba\u015flad\u0131klar\u0131 s\u0131raya g\u00f6re eri\u015fim garantisi verir. Yani, en uzun s\u00fcre bekleyen i\u015f par\u00e7ac\u0131\u011f\u0131, kilit serbest b\u0131rak\u0131ld\u0131\u011f\u0131nda ilk olarak kilidi edinecektir. Bu, i\u015f par\u00e7ac\u0131\u011f\u0131 a\u00e7l\u0131\u011f\u0131n\u0131 (starvation) \u00f6nler.<\/p>\n<p><strong>Avantajlar\u0131:<\/strong> \u0130\u015f par\u00e7ac\u0131\u011f\u0131 a\u00e7l\u0131\u011f\u0131n\u0131 engeller, daha \u00f6ng\u00f6r\u00fclebilir davran\u0131\u015f sa\u011flar.<br \/>\n<strong>Dezavantajlar\u0131:<\/strong> Genellikle adil olmayan kilitlerden daha d\u00fc\u015f\u00fck performansa sahiptir. Bunun nedeni, kilitleme ve kilit a\u00e7ma i\u015flemleri s\u0131ras\u0131nda daha fazla i\u015fletim sistemi \u00e7a\u011fr\u0131s\u0131 ve i\u015f par\u00e7ac\u0131\u011f\u0131 ba\u011flam anahtarlamas\u0131 (context switching) gerektirmesidir.<\/p>\n<h5>Adil Olmayan Kilit (Non-Fair Lock)<\/h5>\n<p>Adil olmayan bir kilit, kilidi bekleyen i\u015f par\u00e7ac\u0131klar\u0131 aras\u0131nda belirli bir s\u0131ra garantisi vermez. Kilit serbest b\u0131rak\u0131ld\u0131\u011f\u0131nda, bekleyen i\u015f par\u00e7ac\u0131klar\u0131ndan herhangi biri (genellikle i\u015fletim sistemi zamanlay\u0131c\u0131s\u0131na ba\u011fl\u0131 olarak) kilidi edinebilir. Hatta, yeni gelen bir i\u015f par\u00e7ac\u0131\u011f\u0131, uzun s\u00fcredir bekleyen di\u011fer i\u015f par\u00e7ac\u0131klar\u0131ndan \u00f6nce kilidi edinebilir. Bu durum \"y\u0131\u011f\u0131lma\" (barging) olarak da adland\u0131r\u0131l\u0131r.<\/p>\n<p><strong>Avantajlar\u0131:<\/strong> Genellikle adil kilitlerden daha y\u00fcksek performansa sahiptir, \u00e7\u00fcnk\u00fc i\u015f par\u00e7ac\u0131\u011f\u0131 ba\u011flam anahtarlamas\u0131 daha azd\u0131r ve CPU \u00f6nbellekleri daha verimli kullan\u0131labilir.<br \/>\n<strong>Dezavantajlar\u0131:<\/strong> \u0130\u015f par\u00e7ac\u0131\u011f\u0131 a\u00e7l\u0131\u011f\u0131na neden olabilir; baz\u0131 i\u015f par\u00e7ac\u0131klar\u0131 kilidi edinmek i\u00e7in \u00e7ok uzun s\u00fcre bekleyebilir.<\/p>\n<p>\u00c7o\u011fu durumda, varsay\u0131lan olan adil olmayan kilitler tercih edilir \u00e7\u00fcnk\u00fc performans avantajlar\u0131 genellikle k\u00fc\u00e7\u00fck bir a\u00e7l\u0131k riski i\u00e7in kabul edilebilir. Ancak, uygulaman\u0131zda kesinlikle belirli bir s\u0131ran\u0131n korunmas\u0131 gerekiyorsa veya i\u015f par\u00e7ac\u0131\u011f\u0131 a\u00e7l\u0131\u011f\u0131n\u0131n kritik bir sorun oldu\u011fu durumlarda adil kilitler kullan\u0131lmal\u0131d\u0131r.<\/p>\n<h3>Ko\u015ful Nesneleri (Condition Objects) ile Geli\u015fmi\u015f \u0130\u015f Par\u00e7ac\u0131\u011f\u0131 \u0130leti\u015fimi<\/h3>\n<p><code>ReentrantLock<\/code> ile birlikte gelen en g\u00fc\u00e7l\u00fc \u00f6zelliklerden biri de <code>Condition<\/code> aray\u00fcz\u00fcd\u00fcr. <code>Condition<\/code> nesneleri, <code>Object.wait()<\/code>, <code>notify()<\/code> ve <code>notifyAll()<\/code> metotlar\u0131n\u0131n <code>Lock<\/code> aray\u00fcz\u00fc kar\u015f\u0131l\u0131\u011f\u0131d\u0131r. Ancak <code>Condition<\/code> nesneleri, <code>synchronized<\/code> anahtar kelimesine ba\u011fl\u0131 olan <code>Object<\/code> metotlar\u0131na g\u00f6re daha esnek ve g\u00fc\u00e7l\u00fcd\u00fcr.<\/p>\n<p><code>Object<\/code> metotlar\u0131, yaln\u0131zca bir nesne monit\u00f6r\u00fc (kilit) ile ili\u015fkilidir ve yaln\u0131zca tek bir bekleme k\u00fcmesi vard\u0131r. Yani, bir nesne \u00fczerinde <code>wait()<\/code> \u00e7a\u011fr\u0131s\u0131 yapan t\u00fcm i\u015f par\u00e7ac\u0131klar\u0131 ayn\u0131 bekleme k\u00fcmesine girer ve <code>notify()<\/code> veya <code>notifyAll()<\/code> \u00e7a\u011fr\u0131s\u0131 yap\u0131ld\u0131\u011f\u0131nda bu k\u00fcmedeki i\u015f par\u00e7ac\u0131klar\u0131 uyand\u0131r\u0131l\u0131r. Bu, bazen istenmeyen uyand\u0131rmalara (spurious wakeups) veya daha az verimli i\u015f par\u00e7ac\u0131\u011f\u0131 y\u00f6netimine yol a\u00e7abilir.<\/p>\n<p><code>Condition<\/code> aray\u00fcz\u00fc, bir <code>Lock<\/code> nesnesiyle ili\u015fkilendirilir ve bir <code>Lock<\/code> nesnesi birden fazla <code>Condition<\/code> nesnesi olu\u015fturabilir. Her <code>Condition<\/code> nesnesi kendi bekleme k\u00fcmesini y\u00f6netir. Bu, geli\u015ftiricilere daha gran\u00fcler (ince taneli) bir kontrol sa\u011flar; farkl\u0131 ko\u015fullar alt\u0131nda bekleyen i\u015f par\u00e7ac\u0131klar\u0131n\u0131 ayr\u0131 ayr\u0131 uyand\u0131rabiliriz.<\/p>\n<p><code>Condition<\/code> aray\u00fcz\u00fcn\u00fcn temel metotlar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <code>void await() throws InterruptedException<\/code>: Kilidi serbest b\u0131rak\u0131r ve i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 bu ko\u015ful nesnesi \u00fczerinde beklemeye al\u0131r. \u0130\u015f par\u00e7ac\u0131\u011f\u0131, ba\u015fka bir i\u015f par\u00e7ac\u0131\u011f\u0131 <code>signal()<\/code> veya <code>signalAll()<\/code> \u00e7a\u011f\u0131rana kadar veya kesintiye u\u011frayana kadar bloke olur. Geri d\u00f6nd\u00fc\u011f\u00fcnde, kilidi tekrar edinir.<br \/>\n*   <code>void signal()<\/code>: Bu ko\u015ful nesnesi \u00fczerinde bekleyen i\u015f par\u00e7ac\u0131klar\u0131ndan birini (rastgele) uyand\u0131r\u0131r.<br \/>\n*   <code>void signalAll()<\/code>: Bu ko\u015ful nesnesi \u00fczerinde bekleyen t\u00fcm i\u015f par\u00e7ac\u0131klar\u0131n\u0131 uyand\u0131r\u0131r.<\/p>\n<p>Bir <code>Condition<\/code> nesnesi, <code>Lock<\/code> nesnesi \u00fczerinden <code>lock.newCondition()<\/code> metodu ile olu\u015fturulur.<\/p>\n<h4>\u00dcretici-T\u00fcketici \u00d6rne\u011fi ile Condition Kullan\u0131m\u0131<\/h4>\n<p>\u00dcretici-t\u00fcketici problemi, e\u015fzamanl\u0131 programlamadaki klasik bir senaryodur ve <code>Condition<\/code> nesnelerinin g\u00fcc\u00fcn\u00fc g\u00f6stermek i\u00e7in harika bir \u00f6rnektir.<\/p>\n<pre><code class=\"language-java\">import java.util.LinkedList;\nimport java.util.Queue;\nimport java.util.concurrent.locks.Condition;\nimport java.util.concurrent.locks.ReentrantLock;\n\npublic class UreticiTuketiciCondition {\n    private final ReentrantLock kilit = new ReentrantLock();\n    private final Condition bosAlanVar = kilit.newCondition(); \/\/ T\u00fcketicilerin beklemesi i\u00e7in\n    private final Condition doluAlanVar = kilit.newCondition(); \/\/ \u00dcreticilerin beklemesi i\u00e7in\n    private final Queue<Integer> tampon = new LinkedList<>();\n    private final int KAPASITE = 5;\n\n    public void uret(int deger) throws InterruptedException {\n        kilit.lock();\n        try {\n            while (tampon.size() == KAPASITE) {\n                System.out.println(\"Tampon dolu, \u00fcretici bekliyor: \" + Thread.currentThread().getName());\n                doluAlanVar.await(); \/\/ Tampon doluysa \u00fcretici bekler\n            }\n            tampon.add(deger);\n            System.out.println(\"\u00dcretildi: \" + deger + \" (Tampon boyutu: \" + tampon.size() + \")\");\n            bosAlanVar.signalAll(); \/\/ T\u00fcketicilere bo\u015f alan oldu\u011funu bildir\n        } finally {\n            kilit.unlock();\n        }\n    }\n\n    public int tuket() throws InterruptedException {\n        kilit.lock();\n        try {\n            while (tampon.isEmpty()) {\n                System.out.println(\"Tampon bo\u015f, t\u00fcketici bekliyor: \" + Thread.currentThread().getName());\n                bosAlanVar.await(); \/\/ Tampon bo\u015fsa t\u00fcketici bekler\n            }\n            int deger = tampon.remove();\n            System.out.println(\"T\u00fcketildi: \" + deger + \" (Tampon boyutu: \" + tampon.size() + \")\");\n            doluAlanVar.signalAll(); \/\/ \u00dcreticilere dolu alan oldu\u011funu bildir\n            return deger;\n        } finally {\n            kilit.unlock();\n        }\n    }\n\n    public static void main(String[] args) {\n        UreticiTuketiciCondition problem = new UreticiTuketiciCondition();\n\n        Runnable ureticiGorevi = () -> {\n            for (int i = 0; i < 10; i++) {\n                try {\n                    problem.uret(i);\n                    Thread.sleep((long) (Math.random() * 100));\n                } catch (InterruptedException e) {\n                    Thread.currentThread().interrupt();\n                }\n            }\n        };\n\n        Runnable tuketiciGorevi = () -> {\n            for (int i = 0; i < 10; i++) {\n                try {\n                    problem.tuket();\n                    Thread.sleep((long) (Math.random() * 150));\n                } catch (InterruptedException e) {\n                    Thread.currentThread().interrupt();\n                }\n            }\n        };\n\n        Thread uretici1 = new Thread(ureticiGorevi, \"\u00dcretici-1\");\n        Thread tuketici1 = new Thread(tuketiciGorevi, \"T\u00fcketici-1\");\n        Thread uretici2 = new Thread(ureticiGorevi, \"\u00dcretici-2\"); \/\/ Birden fazla \u00fcretici\/t\u00fcketici i\u00e7in\n        Thread tuketici2 = new Thread(tuketiciGorevi, \"T\u00fcketici-2\");\n\n        uretici1.start();\n        tuketici1.start();\n        uretici2.start();\n        tuketici2.start();\n\n        \/\/ main thread'in bitmesini beklemek i\u00e7in join kullan\u0131labilir,\n        \/\/ ancak bu \u00f6rnekte output'u izlemek i\u00e7in gerek yok.\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>bosAlanVar<\/code> ve <code>doluAlanVar<\/code> olmak \u00fczere iki farkl\u0131 <code>Condition<\/code> nesnesi kullan\u0131yoruz.<br \/>\n*   <code>uret()<\/code> metodu, tampon doluysa <code>doluAlanVar.await()<\/code> \u00e7a\u011f\u0131rarak \u00fcretici i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 beklemeye al\u0131r ve tampon bo\u015fald\u0131\u011f\u0131nda <code>bosAlanVar.signalAll()<\/code> ile t\u00fcketicileri uyar\u0131r.<br \/>\n*   <code>tuket()<\/code> metodu, tampon bo\u015fsa <code>bosAlanVar.await()<\/code> \u00e7a\u011f\u0131rarak t\u00fcketici i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 beklemeye al\u0131r ve tampon doldu\u011funda <code>doluAlanVar.signalAll()<\/code> ile \u00fcreticileri uyar\u0131r.<\/p>\n<p>Bu ayr\u0131m, <code>synchronized<\/code> ile <code>Object.wait()\/notify()<\/code> kullan\u0131lsayd\u0131 m\u00fcmk\u00fcn olmazd\u0131 ve t\u00fcm bekleyen i\u015f par\u00e7ac\u0131klar\u0131 tek bir <code>notifyAll()<\/code> ile uyand\u0131r\u0131lmak zorunda kal\u0131rd\u0131, bu da gereksiz ba\u011flam anahtarlamalar\u0131na yol a\u00e7abilirdi.<\/p>\n<h3>ReentrantLock Kullan\u0131m \u00d6rnekleri<\/h3>\n<p>Daha \u00f6nce bahsedilen temel saya\u00e7 ve \u00fcretici-t\u00fcketici \u00f6rneklerinin yan\u0131 s\u0131ra, <code>ReentrantLock<\/code>'\u0131n di\u011fer g\u00fc\u00e7l\u00fc \u00f6zelliklerini g\u00f6steren \u00f6rnekler de inceleyelim.<\/p>\n<h4>Yeniden Giri\u015flilik (Reentrancy) \u00d6rne\u011fi<\/h4>\n<p>A\u015fa\u011f\u0131daki \u00f6rnek, bir i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n zaten sahip oldu\u011fu bir kilidi tekrar nas\u0131l edinebilece\u011fini g\u00f6sterir.<\/p>\n<pre><code class=\"language-java\">import java.util.concurrent.locks.ReentrantLock;\n\npublic class ReentrantLockReentrancyOrnegi {\n    private final ReentrantLock kilit = new ReentrantLock();\n\n    public void disMetot() {\n        kilit.lock();\n        try {\n            System.out.println(Thread.currentThread().getName() + \" d\u0131\u015f metotta kilidi edindi.\");\n            icMetot(); \/\/ Ayn\u0131 kilit tekrar ediniliyor\n        } finally {\n            kilit.unlock();\n            System.out.println(Thread.currentThread().getName() + \" d\u0131\u015f metotta kilidi serbest b\u0131rakt\u0131.\");\n        }\n    }\n\n    public void icMetot() {\n        kilit.lock(); \/\/ Yeniden giri\u015fli kilit, ayn\u0131 i\u015f par\u00e7ac\u0131\u011f\u0131 taraf\u0131ndan tekrar edinilebilir\n        try {\n            System.out.println(Thread.currentThread().getName() + \" i\u00e7 metotta kilidi edindi.\");\n        } finally {\n            kilit.unlock();\n            System.out.println(Thread.currentThread().getName() + \" i\u00e7 metotta kilidi serbest b\u0131rakt\u0131.\");\n        }\n    }\n\n    public static void main(String[] args) {\n        ReentrantLockReentrancyOrnegi ornek = new ReentrantLockReentrancyOrnegi();\n\n        Runnable gorev = () -> {\n            ornek.disMetot();\n        };\n\n        Thread t1 = new Thread(gorev, \"Thread-1\");\n        t1.start();\n    }\n}<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131da g\u00f6r\u00fclece\u011fi \u00fczere, <code>Thread-1<\/code> d\u0131\u015f metotta kilidi edindikten sonra, i\u00e7 metodu \u00e7a\u011f\u0131rd\u0131\u011f\u0131nda ayn\u0131 kilidi tekrar edinebilir ve herhangi bir kilitlenme ya\u015fanmaz. <code>unlock()<\/code> \u00e7a\u011fr\u0131lar\u0131 da do\u011fru s\u0131rayla yap\u0131ld\u0131\u011f\u0131nda kilit serbest b\u0131rak\u0131l\u0131r.<\/p>\n<h4><code>tryLock()<\/code> ve Zaman A\u015f\u0131m\u0131 \u00d6rne\u011fi<\/h4>\n<p><code>tryLock()<\/code> metodu, bir i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n kilidi hemen alam\u0131yorsa bloke olmak yerine ba\u015fka bir i\u015flem yapmas\u0131na olanak tan\u0131r. Zaman a\u015f\u0131m\u0131 parametresiyle birlikte kullan\u0131ld\u0131\u011f\u0131nda, belirli bir s\u00fcre bekledikten sonra kilidi alam\u0131yorsa i\u015f par\u00e7ac\u0131\u011f\u0131na devam etme esnekli\u011fi sa\u011flar.<\/p>\n<pre><code class=\"language-java\">import java.util.concurrent.TimeUnit;\nimport java.util.concurrent.locks.ReentrantLock;\n\npublic class ReentrantLockTryLockOrnegi {\n    private final ReentrantLock kilit = new ReentrantLock();\n\n    public void islemYap(int id) {\n        try {\n            if (kilit.tryLock(1, TimeUnit.SECONDS)) { \/\/ 1 saniye bekle, alam\u0131yorsan devam et\n                try {\n                    System.out.println(\"\u0130\u015f Par\u00e7ac\u0131\u011f\u0131 \" + id + \": Kilidi edindi ve i\u015fleme ba\u015fl\u0131yor.\");\n                    Thread.sleep(2000); \/\/ 2 saniye boyunca kilidi tut\n                    System.out.println(\"\u0130\u015f Par\u00e7ac\u0131\u011f\u0131 \" + id + \": \u0130\u015flemi tamamlad\u0131.\");\n                } finally {\n                    kilit.unlock();\n                    System.out.println(\"\u0130\u015f Par\u00e7ac\u0131\u011f\u0131 \" + id + \": Kilidi serbest b\u0131rakt\u0131.\");\n                }\n            } else {\n                System.out.println(\"\u0130\u015f Par\u00e7ac\u0131\u011f\u0131 \" + id + \": Kilidi edinemedi, ba\u015fka i\u015f yap\u0131yor.\");\n                \/\/ Kilidi alamad\u0131\u011f\u0131 durumda yap\u0131lacak alternatif i\u015fler\n                Thread.sleep(500);\n            }\n        } catch (InterruptedException e) {\n            Thread.currentThread().interrupt();\n            System.out.println(\"\u0130\u015f Par\u00e7ac\u0131\u011f\u0131 \" + id + \": Kesintiye u\u011frad\u0131.\");\n        }\n    }\n\n    public static void main(String[] args) throws InterruptedException {\n        ReentrantLockTryLockOrnegi ornek = new ReentrantLockTryLockOrnegi();\n\n        Runnable gorev1 = () -> ornek.islemYap(1);\n        Runnable gorev2 = () -> ornek.islemYap(2);\n\n        Thread t1 = new Thread(gorev1);\n        Thread t2 = new Thread(gorev2);\n\n        t1.start();\n        Thread.sleep(100); \/\/ t1'in kilidi \u00f6nce almas\u0131n\u0131 sa\u011flamak i\u00e7in k\u00fc\u00e7\u00fck bir gecikme\n        t2.start();\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>Thread-1<\/code> kilidi edinecek ve 2 saniye boyunca tutacakt\u0131r. <code>Thread-2<\/code> ise 1 saniye bekleyecek, kilidi alamad\u0131\u011f\u0131 i\u00e7in \"Kilidi edinemedi, ba\u015fka i\u015f yap\u0131yor.\" mesaj\u0131n\u0131 yazd\u0131r\u0131p devam edecektir. Bu, <code>synchronized<\/code> ile m\u00fcmk\u00fcn olmayan bir esnekliktir.<\/p>\n<h4><code>lockInterruptibly()<\/code> \u00d6rne\u011fi<\/h4>\n<p><code>lockInterruptibly()<\/code> metodu, bir i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n kilit beklerken kesintiye u\u011framas\u0131na ve bekleme durumundan \u00e7\u0131kmas\u0131na olanak tan\u0131r.<\/p>\n<pre><code class=\"language-java\">import java.util.concurrent.locks.ReentrantLock;\n\npublic class ReentrantLockInterruptiblyOrnegi {\n    private final ReentrantLock kilit = new ReentrantLock();\n\n    public void islemYap() {\n        try {\n            kilit.lockInterruptibly(); \/\/ Kesintiye u\u011frayabilen kilit edinme\n            try {\n                System.out.println(Thread.currentThread().getName() + \": Kilidi edindi ve i\u015fleme ba\u015fl\u0131yor.\");\n                \/\/ Uzun s\u00fcreli bir i\u015flem sim\u00fclasyonu\n                Thread.sleep(5000);\n                System.out.println(Thread.currentThread().getName() + \": \u0130\u015flemi tamamlad\u0131.\");\n            } finally {\n                kilit.unlock();\n                System.out.println(Thread.currentThread().getName() + \": Kilidi serbest b\u0131rakt\u0131.\");\n            }\n        } catch (InterruptedException e) {\n            System.out.println(Thread.currentThread().getName() + \": Kilit beklerken kesintiye u\u011frad\u0131.\");\n            Thread.currentThread().interrupt(); \/\/ Kesinti durumunu koru\n        }\n    }\n\n    public static void main(String[] args) throws InterruptedException {\n        ReentrantLockInterruptiblyOrnegi ornek = new ReentrantLockInterruptiblyOrnegi();\n\n        Thread t1 = new Thread(ornek::islemYap, \"Thread-1\");\n        Thread t2 = new Thread(ornek::islemYap, \"Thread-2\");\n\n        t1.start();\n        Thread.sleep(100); \/\/ t1'in kilidi \u00f6nce almas\u0131n\u0131 sa\u011fla\n        t2.start();\n\n        Thread.sleep(1000); \/\/ t2'nin kilit beklemesini sa\u011fla\n        t2.interrupt(); \/\/ t2'yi kesintiye u\u011frat\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>Thread-1<\/code> kilidi edinir ve 5 saniye boyunca tutar. <code>Thread-2<\/code> ise kilidi edinmek i\u00e7in <code>lockInterruptibly()<\/code> ile beklemeye ba\u015flar. 1 saniye sonra <code>main<\/code> i\u015f par\u00e7ac\u0131\u011f\u0131 <code>Thread-2<\/code>'yi kesintiye u\u011frat\u0131r. <code>Thread-2<\/code>, kilit beklerken kesintiye u\u011frad\u0131\u011f\u0131 i\u00e7in <code>InterruptedException<\/code> yakalar ve bekleme durumundan \u00e7\u0131kar. <code>synchronized<\/code> anahtar kelimesiyle bu t\u00fcr bir kesintiye u\u011frama m\u00fcmk\u00fcn de\u011fildir.<\/p>\n<h3>ReentrantLock ve synchronized Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/h3>\n<p><code>ReentrantLock<\/code> ve <code>synchronized<\/code> anahtar kelimesi, Java'da i\u015f par\u00e7ac\u0131\u011f\u0131 g\u00fcvenli\u011fini sa\u011flamak i\u00e7in kullan\u0131lan iki temel mekanizmad\u0131r. Her ikisi de kar\u015f\u0131l\u0131kl\u0131 d\u0131\u015flamay\u0131 (mutual exclusion) sa\u011flar, yani ayn\u0131 anda yaln\u0131zca bir i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n kritik bir b\u00f6l\u00fcme eri\u015fmesine izin verir. Ancak aralar\u0131nda \u00f6nemli farklar bulunur:<\/p>\n<h4>Benzerlikler<\/h4>\n<p>*   <strong>Kar\u015f\u0131l\u0131kl\u0131 D\u0131\u015flama:<\/strong> Her ikisi de payla\u015f\u0131lan kaynaklara ayn\u0131 anda birden fazla i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n eri\u015fmesini engelleyerek veri tutars\u0131zl\u0131klar\u0131n\u0131 \u00f6nler.<br \/>\n*   <strong>Yeniden Giri\u015flilik:<\/strong> Her ikisi de yeniden giri\u015flidir. Yani, bir i\u015f par\u00e7ac\u0131\u011f\u0131 zaten sahip oldu\u011fu bir <code>synchronized<\/code> blo\u011fa veya <code>ReentrantLock<\/code>'a tekrar girebilir.<\/p>\n<h4>Farkl\u0131l\u0131klar<\/h4>\n<p>1.  <strong>A\u00e7\u0131kl\u0131k ve Kontrol:<\/strong><br \/>\n    *   <strong><code>synchronized<\/code>:<\/strong> Implicit (\u00f6rt\u00fck) bir mekanizmad\u0131r. Kilitleme ve kilit a\u00e7ma i\u015flemleri JVM taraf\u0131ndan otomatik olarak y\u00f6netilir. Geli\u015ftiricinin do\u011frudan kontrol\u00fc yoktur.<br \/>\n    *   <strong><code>ReentrantLock<\/code>:<\/strong> Explicit (a\u00e7\u0131k) bir mekanizmad\u0131r. Kilitleme (<code>lock()<\/code>) ve kilit a\u00e7ma (<code>unlock()<\/code>) metotlar\u0131n\u0131 a\u00e7\u0131k\u00e7a \u00e7a\u011f\u0131rman\u0131z gerekir. Bu, daha fazla kontrol ve esneklik sa\u011flar.<\/p>\n<p>2.  <strong>Esneklik ve Ek \u00d6zellikler:<\/strong><br \/>\n    *   <strong><code>synchronized<\/code>:<\/strong> S\u0131n\u0131rl\u0131 esnekli\u011fe sahiptir. Kilidi deneme (<code>tryLock()<\/code>), kesintiye u\u011frayabilen kilit bekleme (<code>lockInterruptibly()<\/code>) veya zaman a\u015f\u0131m\u0131 ile kilit bekleme gibi \u00f6zellikler sunmaz.<br \/>\n    *   <strong><code>ReentrantLock<\/code>:<\/strong> <code>tryLock()<\/code>, <code>lockInterruptibly()<\/code>, <code>tryLock(timeout, unit)<\/code> gibi metotlarla daha geli\u015fmi\u015f kilit edinme stratejileri sunar. Ayr\u0131ca adil (fair) kilitler olu\u015fturma se\u00e7ene\u011fi de vard\u0131r.<\/p>\n<p>3.  <strong>Hata Y\u00f6netimi ve Kilit B\u0131rakma:<\/strong><br \/>\n    *   <strong><code>synchronized<\/code>:<\/strong> Kilit, senkronize edilmi\u015f blo\u011fun sonuna ula\u015f\u0131ld\u0131\u011f\u0131nda veya bir istisna f\u0131rlat\u0131ld\u0131\u011f\u0131nda otomatik olarak serbest b\u0131rak\u0131l\u0131r. Bu, geli\u015ftiricinin kilit serbest b\u0131rakmay\u0131 unutma riskini ortadan kald\u0131r\u0131r.<br \/>\n    *   <strong><code>ReentrantLock<\/code>:<\/strong> Kilidi <code>finally<\/code> blo\u011fu i\u00e7inde a\u00e7\u0131k\u00e7a <code>unlock()<\/code> ile serbest b\u0131rakmak geli\u015ftiricinin sorumlulu\u011fundad\u0131r. Aksi takdirde, bir istisna durumunda kilit serbest b\u0131rak\u0131lamaz ve di\u011fer i\u015f par\u00e7ac\u0131klar\u0131 kilitli kal\u0131r (deadlock).<\/p>\n<p>4.  <strong>Ko\u015ful De\u011fi\u015fkenleri (Condition Variables):<\/strong><br \/>\n    *   <strong><code>synchronized<\/code>:<\/strong> <code>Object.wait()<\/code>, <code>notify()<\/code>, <code>notifyAll()<\/code> metotlar\u0131n\u0131 kullanarak i\u015f par\u00e7ac\u0131\u011f\u0131 ileti\u015fimini sa\u011flar. Bu metotlar belirli bir nesnenin monit\u00f6r\u00fcne ba\u011fl\u0131d\u0131r ve tek bir bekleme k\u00fcmesini y\u00f6netir.<br \/>\n    *   <strong><code>ReentrantLock<\/code>:<\/strong> <code>Condition<\/code> aray\u00fcz\u00fcn\u00fc kullan\u0131r. Bir <code>Lock<\/code> nesnesi birden fazla <code>Condition<\/code> nesnesi olu\u015fturabilir, bu da daha gran\u00fcler i\u015f par\u00e7ac\u0131\u011f\u0131 ileti\u015fimine olanak tan\u0131r. Farkl\u0131 ko\u015fullar alt\u0131nda bekleyen i\u015f par\u00e7ac\u0131klar\u0131 ayr\u0131 ayr\u0131 y\u00f6netilebilir.<\/p>\n<p>5.  <strong>Performans:<\/strong><br \/>\n    *   Performans a\u00e7\u0131s\u0131ndan, eski Java s\u00fcr\u00fcmlerinde <code>ReentrantLock<\/code> genellikle <code>synchronized<\/code>'dan daha iyi performans g\u00f6steriyordu. Ancak modern JVM'ler, <code>synchronized<\/code> anahtar kelimesi i\u00e7in \u00f6nemli optimizasyonlar (\u00f6rne\u011fin, lock elision, biased locking) i\u00e7ermektedir. Bu nedenle, \u00e7o\u011fu durumda performans fark\u0131 ihmal edilebilir d\u00fczeydedir veya <code>synchronized<\/code> daha iyi performans g\u00f6sterebilir.<br \/>\n    *   Ancak, y\u00fcksek \u00e7eki\u015fme (high contention) durumlar\u0131nda veya adil kilitler kullan\u0131ld\u0131\u011f\u0131nda <code>ReentrantLock<\/code>'\u0131n performans\u0131 daha \u00f6ng\u00f6r\u00fclebilir olabilir.<\/p>\n<h4>Ne Zaman Hangisini Kullanmal\u0131?<\/h4>\n<p>*   <strong><code>synchronized<\/code> kullan\u0131n:<\/strong><br \/>\n    *   Basit senkronizasyon ihtiya\u00e7lar\u0131n\u0131z varsa.<br \/>\n    *   Kilitleme ve kilit a\u00e7ma \u00fczerinde ekstra kontrol gerekmiyorsa.<br \/>\n    *   <code>Object.wait()\/notify()<\/code> ile i\u015f par\u00e7ac\u0131\u011f\u0131 ileti\u015fimi yeterliyse.<br \/>\n    *   Kodun daha az karma\u015f\u0131k olmas\u0131n\u0131 istiyorsan\u0131z.<br \/>\n    *   Performans kritik bir endi\u015fe de\u011filse ve varsay\u0131lan JVM optimizasyonlar\u0131na g\u00fcveniyorsan\u0131z.<\/p>\n<p>*   <strong><code>ReentrantLock<\/code> kullan\u0131n:<\/strong><br \/>\n    *   Kilidi edinme ve serbest b\u0131rakma \u00fczerinde daha fazla kontrol gerekiyorsa.<br \/>\n    *   Kilidi deneme (<code>tryLock()<\/code>) veya zaman a\u015f\u0131m\u0131 ile edinme ihtiyac\u0131n\u0131z varsa.<br \/>\n    *   Kilit beklerken i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n kesintiye u\u011framas\u0131n\u0131 sa\u011flamak istiyorsan\u0131z (<code>lockInterruptibly()<\/code>).<br \/>\n    *   Birden fazla ko\u015ful de\u011fi\u015fkenine (<code>Condition<\/code> nesneleri) ihtiyac\u0131n\u0131z varsa (\u00f6rne\u011fin, karma\u015f\u0131k \u00fcretici-t\u00fcketici senaryolar\u0131).<br \/>\n    *   Adil kilit davran\u0131\u015f\u0131na ihtiyac\u0131n\u0131z varsa.<br \/>\n    *   \u00c7ok y\u00fcksek \u00e7eki\u015fme alt\u0131nda performans optimizasyonlar\u0131 ar\u0131yorsan\u0131z.<\/p>\n<p>Genel bir kural olarak, <code>synchronized<\/code> anahtar kelimesi \u00e7o\u011fu senaryo i\u00e7in yeterli ve tercih edilebilir bir \u00e7\u00f6z\u00fcmd\u00fcr. Ancak <code>ReentrantLock<\/code>, <code>synchronized<\/code>'\u0131n yetersiz kald\u0131\u011f\u0131 daha karma\u015f\u0131k ve \u00f6zel e\u015fzamanl\u0131l\u0131k ihtiya\u00e7lar\u0131 i\u00e7in g\u00fc\u00e7l\u00fc bir alternatiftir.<\/p>\n<h3>En \u0130yi Uygulamalar ve Dikkat Edilmesi Gerekenler<\/h3>\n<p><code>ReentrantLock<\/code> kullan\u0131rken a\u015fa\u011f\u0131daki en iyi uygulamalar\u0131 ve dikkat edilmesi gereken noktalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak, sa\u011flam ve hatas\u0131z e\u015fzamanl\u0131 uygulamalar geli\u015ftirmenize yard\u0131mc\u0131 olacakt\u0131r:<\/p>\n<p>*   <strong><code>finally<\/code> Blo\u011fu Kullan\u0131m\u0131:<\/strong> Her zaman <code>lock()<\/code> \u00e7a\u011fr\u0131s\u0131ndan sonra <code>unlock()<\/code> metodunu bir <code>finally<\/code> blo\u011fu i\u00e7inde \u00e7a\u011f\u0131r\u0131n. Bu, kodunuzda bir istisna olu\u015fsa bile kilidin serbest b\u0131rak\u0131lmas\u0131n\u0131 garanti eder ve kilitlenmeleri (deadlock) \u00f6nler.<\/p>\n<pre><code class=\"language-java\">kilit.lock();\n    try {\n        \/\/ Kritik b\u00f6l\u00fcm\n    } finally {\n        kilit.unlock();\n    }<\/code><\/pre>\n<p>*   <strong>Deadlock'lardan Ka\u00e7\u0131nma:<\/strong> Birden fazla kilit kullan\u0131rken, i\u015f par\u00e7ac\u0131klar\u0131n\u0131n kilitleri her zaman ayn\u0131 s\u0131rada edinmesini sa\u011flay\u0131n. Farkl\u0131 i\u015f par\u00e7ac\u0131klar\u0131n\u0131n kilitleri farkl\u0131 s\u0131ralarda edinmeye \u00e7al\u0131\u015fmas\u0131 deadlock'a yol a\u00e7abilir.<br \/>\n*   <strong>Adillik Se\u00e7imi:<\/strong> Uygulaman\u0131z\u0131n gereksinimlerine g\u00f6re adil veya adil olmayan kilit aras\u0131nda bilin\u00e7li bir se\u00e7im yap\u0131n. Performans genellikle adil olmayan kilitleri desteklerken, i\u015f par\u00e7ac\u0131\u011f\u0131 a\u00e7l\u0131\u011f\u0131ndan kesinlikle ka\u00e7\u0131nmak gerekiyorsa adil kilitler tercih edilmelidir.<br \/>\n*   <strong>Performans De\u011ferlendirmesi:<\/strong> <code>ReentrantLock<\/code> veya <code>synchronized<\/code> aras\u0131nda se\u00e7im yaparken, uygulaman\u0131z\u0131n ger\u00e7ek d\u00fcnya senaryolar\u0131nda performans testleri yap\u0131n. Varsay\u0131mlara dayanmak yerine \u00f6l\u00e7\u00fcmlere g\u00fcvenin.<br \/>\n*   <strong><code>Condition<\/code> Nesnelerinin Do\u011fru Kullan\u0131m\u0131:<\/strong> <code>await()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131 her zaman bir <code>while<\/code> d\u00f6ng\u00fcs\u00fc i\u00e7inde yap\u0131n (<code>while (ko\u015ful do\u011fru de\u011filse) { condition.await(); }<\/code>). Bu, istenmeyen uyand\u0131rmalara (spurious wakeups) kar\u015f\u0131 koruma sa\u011flar.<br \/>\n*   <strong>Kesinti Y\u00f6netimi:<\/strong> <code>lockInterruptibly()<\/code> veya <code>await()<\/code> gibi kesintiye u\u011frayabilen metotlar\u0131 kullan\u0131rken, <code>InterruptedException<\/code>'\u0131 do\u011fru bir \u015fekilde yakalay\u0131n ve i\u015fleyin. Genellikle, i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n kesinti durumunu tekrar ayarlamak (<code>Thread.currentThread().interrupt();<\/code>) ve \u00fcst katmanlara yaymak iyi bir uygulamad\u0131r.<br \/>\n*   <strong>Kilit Kapsam\u0131:<\/strong> Kilidi m\u00fcmk\u00fcn olan en dar kapsamda tutmaya \u00e7al\u0131\u015f\u0131n. Gereksiz yere b\u00fcy\u00fck kod bloklar\u0131n\u0131 kilitlemek, e\u015fzamanl\u0131l\u0131\u011f\u0131 azalt\u0131r ve performans d\u00fc\u015f\u00fc\u015f\u00fcne neden olabilir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p><code>ReentrantLock<\/code>, Java'n\u0131n e\u015fzamanl\u0131l\u0131k API'sinde \u00f6nemli bir yer tutan, g\u00fc\u00e7l\u00fc ve esnek bir kilit mekanizmas\u0131d\u0131r. <code>synchronized<\/code> anahtar kelimesinin sundu\u011fu temel i\u015flevselli\u011fin \u00f6tesine ge\u00e7erek, geli\u015ftiricilere kilit edinme ve serbest b\u0131rakma s\u00fcre\u00e7leri \u00fczerinde daha ince taneli kontrol, kesintiye u\u011frayabilen kilit bekleme, zaman a\u015f\u0131m\u0131 ile kilit deneme ve birden fazla ko\u015ful de\u011fi\u015fkeni gibi geli\u015fmi\u015f \u00f6zellikler sunar.<\/p>\n<p>Her ne kadar <code>synchronized<\/code> \u00e7o\u011fu senaryo i\u00e7in yeterli olsa ve modern JVM optimizasyonlar\u0131 sayesinde performans a\u00e7\u0131s\u0131ndan rekabet\u00e7i olsa da, <code>ReentrantLock<\/code> karma\u015f\u0131k e\u015fzamanl\u0131 uygulamalarda daha fazla esneklik ve kontrol gerektiren durumlar i\u00e7in vazge\u00e7ilmezdir. \u00d6zellikle \u00fcretici-t\u00fcketici gibi karma\u015f\u0131k i\u015f par\u00e7ac\u0131\u011f\u0131 ileti\u015fim senaryolar\u0131nda <code>Condition<\/code> nesneleriyle birlikte kullan\u0131ld\u0131\u011f\u0131nda, <code>ReentrantLock<\/code> kodunuzun daha temiz, daha verimli ve daha y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar. Ancak, bu g\u00fcc\u00fcn sorumlulukla geldi\u011fini unutmamak ve <code>finally<\/code> blo\u011fu i\u00e7inde kilit serbest b\u0131rakma gibi en iyi uygulamalara s\u0131k\u0131ca ba\u011fl\u0131 kalmak hayati \u00f6nem ta\u015f\u0131r. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, <code>ReentrantLock<\/code> Java uygulamalar\u0131n\u0131z\u0131n \u00e7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 ortam\u0131nda g\u00fcvenilirli\u011fini ve performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Java&#8217;da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi\n\u00c7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 (multi-threading) programlama, modern uygulamalar\u0131n p","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1408],"tags":[],"class_list":{"0":"post-35296","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Java&#039;da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java&#039;da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi\" \/>\n<meta property=\"og:description\" content=\"Java&#039;da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi \u00c7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 (multi-threading) programlama, modern uygulamalar\u0131n p\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-27T22:40:52+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java&#8217;da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi\",\"datePublished\":\"2025-11-27T22:40:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/\"},\"wordCount\":3309,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Java\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/\",\"name\":\"Java'da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-27T22:40:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java&#8217;da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Java'da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/","og_locale":"tr_TR","og_type":"article","og_title":"Java'da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi","og_description":"Java'da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi \u00c7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 (multi-threading) programlama, modern uygulamalar\u0131n p","og_url":"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-27T22:40:52+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java&#8217;da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi","datePublished":"2025-11-27T22:40:52+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/"},"wordCount":3309,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Java"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/","url":"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/","name":"Java'da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-27T22:40:52+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javada-gelismis-senkronizasyon-reentrantlock-detayli-incelemesi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java&#8217;da Geli\u015fmi\u015f Senkronizasyon: ReentrantLock Detayl\u0131 \u0130ncelemesi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35296","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=35296"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35296\/revisions"}],"predecessor-version":[{"id":35297,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35296\/revisions\/35297"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35296"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35296"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}