{"id":38161,"date":"2026-01-24T18:00:39","date_gmt":"2026-01-24T15:00:39","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/"},"modified":"2026-01-24T18:00:39","modified_gmt":"2026-01-24T15:00:39","slug":"java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/","title":{"rendered":"Java Multithreading Explained: Thread States, Synchronization &#038; Deadlocks &#8211; Through One Example"},"content":{"rendered":"<h2>Java Multithreading Explained: Thread States, Synchronization &#038; Deadlocks &#8211; Through One Example<\/h2>\n<p>Java multithreading, modern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir. Uygulamalar\u0131n daha h\u0131zl\u0131, daha tepkisel ve daha verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayan bu g\u00fc\u00e7l\u00fc mekanizma, ayn\u0131 zamanda dikkatli kullan\u0131lmad\u0131\u011f\u0131nda karma\u015f\u0131k sorunlara yol a\u00e7abilir. Bu makalede, Java\u2019da \u00e7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 (multithreading) kavram\u0131n\u0131, i\u015f par\u00e7ac\u0131\u011f\u0131 durumlar\u0131n\u0131, e\u015fzamanl\u0131l\u0131k kontrol\u00fcn\u00fc (synchronization) ve kilitlenme (deadlock) gibi yayg\u0131n sorunlar\u0131 tek bir \u00f6rnek \u00fczerinden detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Amac\u0131m\u0131z, hem teorik bilgiyi peki\u015ftirmek hem de pratik kod \u00f6rnekleriyle konuyu somutla\u015ft\u0131rmakt\u0131r.<\/p>\n<h3>1. Giri\u015f: Java Multithreading Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Multithreading, bir program\u0131n ayn\u0131 anda birden fazla i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 (thread) e\u015fzamanl\u0131 olarak y\u00fcr\u00fctme yetene\u011fidir. Her bir thread, program\u0131n ba\u011f\u0131ms\u0131z bir y\u00fcr\u00fctme yolunu temsil eder. Tek \u00e7ekirdekli i\u015flemcilerde bu, CPU&#8217;nun farkl\u0131 thread&#8217;ler aras\u0131nda h\u0131zla ge\u00e7i\u015f yapmas\u0131yla (context switching) sa\u011flan\u0131rken, \u00e7ok \u00e7ekirdekli i\u015flemcilerde birden fazla thread ger\u00e7ekten paralel olarak \u00e7al\u0131\u015fabilir. Multithreading, \u00f6zellikle kullan\u0131c\u0131 aray\u00fcz\u00fc donmalar\u0131n\u0131 engellemek, uzun s\u00fcren i\u015flemleri arka planda \u00e7al\u0131\u015ft\u0131rmak ve genel uygulama performans\u0131n\u0131 art\u0131rmak i\u00e7in kritik \u00f6neme sahiptir. \u00d6rne\u011fin, bir web sunucusu her gelen iste\u011fi ayr\u0131 bir thread&#8217;de i\u015fleyerek binlerce kullan\u0131c\u0131ya ayn\u0131 anda hizmet verebilir.<\/p>\n<h3>2. Thread Kavram\u0131 ve Ya\u015fam D\u00f6ng\u00fcs\u00fc (Thread States)<\/h3>\n<p>Java&#8217;da bir thread olu\u015fturman\u0131n iki ana yolu vard\u0131r: <code>Thread<\/code> s\u0131n\u0131f\u0131ndan t\u00fcretmek veya <code>Runnable<\/code> aray\u00fcz\u00fcn\u00fc uygulamak. <code>Runnable<\/code> aray\u00fcz\u00fcn\u00fc kullanmak genellikle tercih edilen y\u00f6ntemdir \u00e7\u00fcnk\u00fc Java tek kal\u0131t\u0131m\u0131 destekledi\u011finden, s\u0131n\u0131f\u0131n\u0131z\u0131n ba\u015fka bir s\u0131n\u0131ftan miras almas\u0131n\u0131 engellemez.<\/p>\n<h4>2.1. Thread Olu\u015fturma ve Ba\u015flatma<\/h4>\n<pre><code class=\"language-java\">\/\/ Runnable aray\u00fcz\u00fcn\u00fc uygulayarak thread olu\u015fturma\nclass MyRunnable implements Runnable {\n    private String threadName;\n\n    public MyRunnable(String name) {\n        this.threadName = name;\n        System.out.println(threadName + \" olu\u015fturuldu.\");\n    }\n\n    @Override\n    public void run() {\n        System.out.println(threadName + \" \u00e7al\u0131\u015fmaya ba\u015flad\u0131.\");\n        try {\n            for (int i = 0; i < 5; i++) {\n                System.out.println(threadName + \": \" + i);\n                Thread.sleep(100); \/\/ Thread'i k\u0131sa bir s\u00fcre beklet\n            }\n        } catch (InterruptedException e) {\n            System.out.println(threadName + \" kesintiye u\u011frad\u0131.\");\n        }\n        System.out.println(threadName + \" sona erdi.\");\n    }\n}\n\npublic class ThreadCreationExample {\n    public static void main(String[] args) {\n        Thread t1 = new Thread(new MyRunnable(\"Thread-1\"));\n        Thread t2 = new Thread(new MyRunnable(\"Thread-2\"));\n\n        t1.start(); \/\/ Thread'i ba\u015flat\n        t2.start(); \/\/ Thread'i ba\u015flat\n    }\n}<\/pre>\n<p><\/code><br \/>\nYukar\u0131daki \u00f6rnekte <code>start()<\/code> metodu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, JVM yeni bir i\u015f par\u00e7ac\u0131\u011f\u0131 olu\u015fturur ve bu i\u015f par\u00e7ac\u0131\u011f\u0131 \u00fczerinde <code>run()<\/code> metodunu y\u00fcr\u00fct\u00fcr.<\/p>\n<h4>2.2. Thread Ya\u015fam D\u00f6ng\u00fcs\u00fc ve Durumlar\u0131<\/h4>\n<p>Bir Java thread'i ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca farkl\u0131 durumlar aras\u0131nda ge\u00e7i\u015f yapar. Bu durumlar\u0131 bilmek, thread'lerin davran\u0131\u015f\u0131n\u0131 anlamak ve olas\u0131 sorunlar\u0131 te\u015fhis etmek i\u00e7in \u00e7ok \u00f6nemlidir.<\/p>\n<table border=\"1\">\n<thead>\n<tr>\n<th>Durum<\/th>\n<th>A\u00e7\u0131klama<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>NEW<\/td>\n<td>Thread nesnesi olu\u015fturuldu ancak hen\u00fcz <code>start()<\/code> metodu \u00e7a\u011fr\u0131lmad\u0131.<\/td>\n<\/tr>\n<tr>\n<td>RUNNABLE<\/td>\n<td>Thread, <code>start()<\/code> metodu \u00e7a\u011fr\u0131ld\u0131ktan sonra \u00e7al\u0131\u015fmaya haz\u0131r hale geldi veya \u00e7al\u0131\u015f\u0131yor. \u0130\u015fletim sistemi zamanlay\u0131c\u0131s\u0131 taraf\u0131ndan \u00e7al\u0131\u015ft\u0131r\u0131lmay\u0131 bekliyor veya \u00e7al\u0131\u015f\u0131yor.<\/td>\n<\/tr>\n<tr>\n<td>BLOCKED<\/td>\n<td>Thread, bir monit\u00f6r kilidini bekliyor (\u00f6rne\u011fin, <code>synchronized<\/code> bir blo\u011fa veya metoda girmek i\u00e7in).<\/td>\n<\/tr>\n<tr>\n<td>WAITING<\/td>\n<td>Thread, ba\u015fka bir thread'in belirli bir eylem ger\u00e7ekle\u015ftirmesini s\u00fcresiz olarak bekliyor (\u00f6rne\u011fin, <code>Object.wait()<\/code>, <code>Thread.join()<\/code>, <code>LockSupport.park()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda).<\/td>\n<\/tr>\n<tr>\n<td>TIMED_WAITING<\/td>\n<td>Thread, belirli bir s\u00fcre boyunca ba\u015fka bir thread'in eylem ger\u00e7ekle\u015ftirmesini bekliyor (\u00f6rne\u011fin, <code>Thread.sleep(long)<\/code>, <code>Object.wait(long)<\/code>, <code>Thread.join(long)<\/code>, <code>LockSupport.parkNanos()<\/code>, <code>LockSupport.parkUntil()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda).<\/td>\n<\/tr>\n<tr>\n<td>TERMINATED<\/td>\n<td>Thread, <code>run()<\/code> metodunu tamamlad\u0131 veya anormal bir \u015fekilde sonland\u0131.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>2.3. Bir Thread Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h4>\n<p>\u0130\u015fletim sistemi, CPU zaman\u0131n\u0131 thread'ler aras\u0131nda payla\u015ft\u0131r\u0131r. Her thread'e belirli bir \"zaman dilimi\" (time slice) atan\u0131r. Bu s\u00fcre doldu\u011funda veya thread bir I\/O i\u015flemi gibi beklemeye ge\u00e7ti\u011finde, i\u015fletim sistemi ba\u015fka bir thread'e ge\u00e7i\u015f yapar (context switching). Bu h\u0131zl\u0131 ge\u00e7i\u015fler, kullan\u0131c\u0131ya birden fazla i\u015flemin ayn\u0131 anda \u00e7al\u0131\u015f\u0131yormu\u015f gibi g\u00f6r\u00fcnmesini sa\u011flar.<\/p>\n<h3>3. \u00d6rnek Senaryo: G\u00fcvenli Olmayan Bir Banka Hesab\u0131 \u0130\u015flemi<\/h3>\n<p>\u015eimdi multithreading'in getirdi\u011fi zorluklar\u0131 anlamak i\u00e7in basit bir banka hesab\u0131 \u00f6rne\u011fi \u00fczerinden ilerleyelim.<\/p>\n<h4>3.1. Problem Tan\u0131m\u0131: Yar\u0131\u015f Durumu (Race Condition)<\/h4>\n<p>Birden fazla thread'in ayn\u0131 anda payla\u015f\u0131lan bir kayna\u011fa (bu durumda banka hesab\u0131 bakiyesi) eri\u015fip onu de\u011fi\u015ftirmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarda \"yar\u0131\u015f durumu\" (race condition) ortaya \u00e7\u0131kabilir. Bu, i\u015flemlerin beklenen s\u0131rayla veya atomik (b\u00f6l\u00fcnmez) bir \u015fekilde ger\u00e7ekle\u015fmemesi nedeniyle veri tutars\u0131zl\u0131klar\u0131na yol a\u00e7ar.<\/p>\n<h4>3.2. Banka Hesab\u0131 S\u0131n\u0131f\u0131<\/h4>\n<p>A\u015fa\u011f\u0131da, basit bir <code>BankAccount<\/code> s\u0131n\u0131f\u0131 bulunmaktad\u0131r. Bu s\u0131n\u0131f\u0131n <code>deposit<\/code> (yat\u0131rma) ve <code>withdraw<\/code> (\u00e7ekme) metotlar\u0131 vard\u0131r.<\/p>\n<pre><code class=\"language-java\">class BankAccount {\n    private double balance;\n\n    public BankAccount(double initialBalance) {\n        this.balance = initialBalance;\n    }\n\n    public double getBalance() {\n        return balance;\n    }\n\n    public void deposit(double amount) {\n        double tempBalance = balance; \/\/ Mevcut bakiyeyi oku\n        tempBalance = tempBalance + amount; \/\/ Yeni bakiyeyi hesapla\n        balance = tempBalance; \/\/ Yeni bakiyeyi yaz\n        System.out.println(Thread.currentThread().getName() + \" yat\u0131rd\u0131: \" + amount + \", Yeni Bakiye: \" + balance);\n    }\n\n    public void withdraw(double amount) {\n        if (balance >= amount) {\n            double tempBalance = balance; \/\/ Mevcut bakiyeyi oku\n            tempBalance = tempBalance - amount; \/\/ Yeni bakiyeyi hesapla\n            balance = tempBalance; \/\/ Yeni bakiyeyi yaz\n            System.out.println(Thread.currentThread().getName() + \" \u00e7ekti: \" + amount + \", Yeni Bakiye: \" + balance);\n        } else {\n            System.out.println(Thread.currentThread().getName() + \" \u00e7ekemedi: \" + amount + \" (Yetersiz bakiye)\");\n        }\n    }\n}<\/pre>\n<p><\/code><\/p>\n<h4>3.3. G\u00fcvenli Olmayan Senaryo<\/h4>\n<p>\u015eimdi iki thread'in ayn\u0131 <code>BankAccount<\/code> nesnesine e\u015fzamanl\u0131 olarak eri\u015fmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131 bir senaryo olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-java\">public class UnsafeBankTransaction {\n    public static void main(String[] args) throws InterruptedException {\n        BankAccount account = new BankAccount(1000);\n\n        Runnable depositor = () -> {\n            for (int i = 0; i < 5; i++) {\n                account.deposit(100);\n                try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); }\n            }\n        };\n\n        Runnable withdrawer = () -> {\n            for (int i = 0; i < 5; i++) {\n                account.withdraw(150);\n                try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); }\n            }\n        };\n\n        Thread t1 = new Thread(depositor, \"Yat\u0131r\u0131c\u0131-Thread\");\n        Thread t2 = new Thread(withdrawer, \"\u00c7ekici-Thread\");\n\n        t1.start();\n        t2.start();\n\n        t1.join(); \/\/ t1 bitene kadar bekle\n        t2.join(); \/\/ t2 bitene kadar bekle\n\n        System.out.println(\"Son Bakiye: \" + account.getBalance());\n        \/\/ Beklenen son bakiye: 1000 + (5*100) - (5*150) = 1000 + 500 - 750 = 750\n    }\n}<\/pre>\n<p><\/code><br \/>\nBu kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, \"Son Bakiye\" \u00e7\u0131kt\u0131s\u0131n\u0131n genellikle beklenen 750 de\u011ferinden farkl\u0131 oldu\u011funu g\u00f6receksiniz. Bunun nedeni, <code>deposit<\/code> ve <code>withdraw<\/code> metotlar\u0131n\u0131n atomik olmamas\u0131d\u0131r. \u00d6rne\u011fin, <code>deposit<\/code> metodu i\u00e7indeki <code>balance<\/code> okuma, hesaplama ve yazma i\u015flemleri aras\u0131nda ba\u015fka bir thread araya girip <code>balance<\/code> de\u011ferini de\u011fi\u015ftirebilir. Bu durum, veri tutars\u0131zl\u0131\u011f\u0131na yol a\u00e7ar.<\/p>\n<h3>4. E\u015fzamanl\u0131l\u0131k Kontrol\u00fc: Synchronization<\/h3>\n<p>Java, payla\u015f\u0131lan kaynaklara g\u00fcvenli eri\u015fimi sa\u011flamak i\u00e7in <code>synchronized<\/code> anahtar kelimesini sunar. <code>synchronized<\/code> metotlar veya kod bloklar\u0131, bir anda yaln\u0131zca tek bir thread'in eri\u015fimine izin verir.<\/p>\n<h4>4.1. <code>synchronized<\/code> Anahtar Kelimesi<\/h4>\n<p><code>synchronized<\/code> anahtar kelimesi, bir nesneye ait monit\u00f6r kilidini kullanarak \u00e7al\u0131\u015f\u0131r. Bir thread <code>synchronized<\/code> bir metoda veya blo\u011fa girdi\u011finde, ilgili nesnenin kilidini al\u0131r. Ba\u015fka bir thread ayn\u0131 nesnenin <code>synchronized<\/code> bir metoduna veya blo\u011funa girmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, kilit serbest b\u0131rak\u0131lana kadar BLOCKED durumuna ge\u00e7er ve bekler.<\/p>\n<h4>4.2. <code>synchronized<\/code> Kullan\u0131m\u0131 ile \u00c7\u00f6z\u00fcm<\/h4>\n<p><code>BankAccount<\/code> s\u0131n\u0131f\u0131ndaki <code>deposit<\/code> ve <code>withdraw<\/code> metotlar\u0131n\u0131 <code>synchronized<\/code> yaparak yar\u0131\u015f durumunu engelleyebiliriz:<\/p>\n<pre><code class=\"language-java\">class SynchronizedBankAccount {\n    private double balance;\n\n    public SynchronizedBankAccount(double initialBalance) {\n        this.balance = initialBalance;\n    }\n\n    public double getBalance() {\n        return balance;\n    }\n\n    \/\/ synchronized metot\n    public synchronized void deposit(double amount) {\n        double tempBalance = balance;\n        tempBalance = tempBalance + amount;\n        balance = tempBalance;\n        System.out.println(Thread.currentThread().getName() + \" yat\u0131rd\u0131: \" + amount + \", Yeni Bakiye: \" + balance);\n    }\n\n    \/\/ synchronized metot\n    public synchronized void withdraw(double amount) {\n        if (balance >= amount) {\n            double tempBalance = balance;\n            tempBalance = tempBalance - amount;\n            balance = tempBalance;\n            System.out.println(Thread.currentThread().getName() + \" \u00e7ekti: \" + amount + \", Yeni Bakiye: \" + balance);\n        } else {\n            System.out.println(Thread.currentThread().getName() + \" \u00e7ekemedi: \" + amount + \" (Yetersiz bakiye)\");\n        }\n    }\n}\n\npublic class SafeBankTransaction {\n    public static void main(String[] args) throws InterruptedException {\n        SynchronizedBankAccount account = new SynchronizedBankAccount(1000);\n\n        Runnable depositor = () -> {\n            for (int i = 0; i < 5; i++) {\n                account.deposit(100);\n                try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); }\n            }\n        };\n\n        Runnable withdrawer = () -> {\n            for (int i = 0; i < 5; i++) {\n                account.withdraw(150);\n                try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); }\n            }\n        };\n\n        Thread t1 = new Thread(depositor, \"Yat\u0131r\u0131c\u0131-Thread\");\n        Thread t2 = new Thread(withdrawer, \"\u00c7ekici-Thread\");\n\n        t1.start();\n        t2.start();\n\n        t1.join();\n        t2.join();\n\n        System.out.println(\"Son Bakiye (G\u00fcvenli): \" + account.getBalance());\n        \/\/ Bu sefer her zaman beklenen 750 de\u011ferini almal\u0131y\u0131z.\n    }\n}<\/pre>\n<p><\/code><br \/>\nBu kodda, <code>deposit<\/code> veya <code>withdraw<\/code> metotlar\u0131ndan herhangi birine ayn\u0131 anda sadece bir thread eri\u015febilir. Di\u011fer thread, kilit serbest b\u0131rak\u0131lana kadar bekler. Bu, veri tutars\u0131zl\u0131\u011f\u0131n\u0131 \u00f6nler ve \"Son Bakiye\" \u00e7\u0131kt\u0131s\u0131n\u0131n her zaman do\u011fru olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>4.3. <code>wait()<\/code>, <code>notify()<\/code>, <code>notifyAll()<\/code><\/h4>\n<p>Bu metotlar, thread'ler aras\u0131nda daha karma\u015f\u0131k ileti\u015fim ve koordinasyon sa\u011flamak i\u00e7in kullan\u0131l\u0131r. Her zaman <code>synchronized<\/code> bir blok veya metot i\u00e7inde \u00e7a\u011fr\u0131lmalar\u0131 gerekir.<br \/>\n*   <code>wait()<\/code>: Thread'i mevcut nesnenin kilidini b\u0131rakmaya ve WAITING durumuna ge\u00e7meye zorlar. Ba\u015fka bir thread <code>notify()<\/code> veya <code>notifyAll()<\/code> \u00e7a\u011f\u0131rana kadar bekler.<br \/>\n*   <code>notify()<\/code>: Ayn\u0131 nesne \u00fczerinde <code>wait()<\/code> durumunda olan tek bir thread'i uyand\u0131r\u0131r.<br \/>\n*   <code>notifyAll()<\/code>: Ayn\u0131 nesne \u00fczerinde <code>wait()<\/code> durumunda olan t\u00fcm thread'leri uyand\u0131r\u0131r.<\/p>\n<h4>4.4. Lock API (ReentrantLock)<\/h4>\n<p><code>synchronized<\/code> anahtar kelimesi basit senaryolar i\u00e7in yeterli olsa da, <code>java.util.concurrent.locks<\/code> paketindeki <code>Lock<\/code> aray\u00fcz\u00fc (\u00f6zellikle <code>ReentrantLock<\/code>), daha esnek ve geli\u015fmi\u015f kilit mekanizmalar\u0131 sunar. \u00d6rne\u011fin, kilidi belirli bir s\u00fcre i\u00e7inde almaya \u00e7al\u0131\u015fma (<code>tryLock()<\/code>) veya kilitleri farkl\u0131 metotlarda al\u0131p b\u0131rakma gibi \u00f6zellikler sa\u011flar.<\/p>\n<h3>5. Kilitlenme (Deadlock): E\u015fzamanl\u0131l\u0131\u011f\u0131n Karanl\u0131k Y\u00fcz\u00fc<\/h3>\n<p>Synchronization, yar\u0131\u015f durumlar\u0131n\u0131 engellerken, yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda \"kilitlenme\" (deadlock) gibi daha sinsi sorunlara yol a\u00e7abilir. Deadlock, iki veya daha fazla thread'in birbirini sonsuza kadar beklemesi durumudur.<\/p>\n<h4>5.1. Deadlock Nedir?<\/h4>\n<p>Deadlock, a\u015fa\u011f\u0131daki d\u00f6rt ko\u015fulun ayn\u0131 anda ger\u00e7ekle\u015fmesiyle ortaya \u00e7\u0131kar:<br \/>\n1.  <strong>Kar\u015f\u0131l\u0131kl\u0131 D\u0131\u015flama (Mutual Exclusion):<\/strong> En az bir kaynak, ayn\u0131 anda yaln\u0131zca bir thread taraf\u0131ndan kullan\u0131labilir.<br \/>\n2.  <strong>Beklet ve Bekle (Hold and Wait):<\/strong> Bir thread, en az bir kayna\u011f\u0131 elinde tutarken, ba\u015fka bir thread taraf\u0131ndan tutulan ek kaynaklar\u0131 bekler.<br \/>\n3.  <strong>Kaynaklar\u0131n \u00d6nceden Al\u0131namamas\u0131 (No Preemption):<\/strong> Bir thread taraf\u0131ndan tutulan kaynaklar, yaln\u0131zca o thread taraf\u0131ndan g\u00f6n\u00fcll\u00fc olarak serbest b\u0131rak\u0131labilir.<br \/>\n4.  <strong>D\u00f6ng\u00fcsel Bekleme (Circular Wait):<\/strong> Thread'lerden olu\u015fan bir d\u00f6ng\u00fc vard\u0131r, \u00f6yle ki her thread, d\u00f6ng\u00fcdeki bir sonraki thread taraf\u0131ndan tutulan bir kayna\u011f\u0131 bekler.<\/p>\n<h4>5.2. Deadlock Senaryosu<\/h4>\n<p>\u0130ki farkl\u0131 banka hesab\u0131na para transferi yapmaya \u00e7al\u0131\u015fan iki thread d\u00fc\u015f\u00fcnelim. Her thread, transfer yapmadan \u00f6nce her iki hesab\u0131n da kilidini almak zorundad\u0131r.<\/p>\n<pre><code class=\"language-java\">class Account {\n    private double balance;\n    private final int id;\n\n    public Account(int id, double initialBalance) {\n        this.id = id;\n        this.balance = initialBalance;\n    }\n\n    public int getId() { return id; }\n    public double getBalance() { return balance; }\n\n    public void deposit(double amount) { balance += amount; }\n    public void withdraw(double amount) { balance -= amount; }\n\n    public void transfer(Account target, double amount) {\n        \/\/ \u0130ki hesab\u0131n kilidini belirli bir s\u0131rada almaya \u00e7al\u0131\u015fal\u0131m\n        \/\/ Kilitleri s\u0131ral\u0131 almak deadlock'u \u00f6nler, ancak burada kas\u0131tl\u0131 olarak deadlock yarataca\u011f\u0131z.\n        \/\/ Genellikle hesap ID'sine g\u00f6re s\u0131ralama yap\u0131l\u0131r.\n        \n        \/\/ Yanl\u0131\u015f S\u0131ralama: Thread-1 \u00f6nce account1, sonra account2 kilitler.\n        \/\/ Thread-2 \u00f6nce account2, sonra account1 kilitler.\n        \n        \/\/ Bu senaryoda deadlock olu\u015fmas\u0131 i\u00e7in kilit alma s\u0131ras\u0131n\u0131 farkl\u0131la\u015ft\u0131raca\u011f\u0131z.\n        \/\/ Normalde id'ye g\u00f6re s\u0131ral\u0131 kilit al\u0131n\u0131r:\n        \/\/ synchronized (this.id < target.id ? this : target) {\n        \/\/     synchronized (this.id < target.id ? target : this) {\n        \/\/         ...\n        \/\/     }\n        \/\/ }\n        \n        \/\/ Deadlock yaratmak i\u00e7in kas\u0131tl\u0131 olarak yanl\u0131\u015f s\u0131ralama yapal\u0131m:\n        \/\/ Thread-1: kilitA -> kilitB\n        \/\/ Thread-2: kilitB -> kilitA\n        \n        \/\/ Bu \u00f6rnekte, transfer metodu i\u00e7inde kilitleri do\u011frudan alaca\u011f\u0131z.\n        \/\/ Ger\u00e7ek bir deadlock i\u00e7in iki farkl\u0131 thread'in farkl\u0131 kilit alma s\u0131ras\u0131na sahip olmas\u0131 gerekir.\n        \/\/ \u00d6rnekte, iki thread'in ayn\u0131 anda farkl\u0131 kilitleri almaya \u00e7al\u0131\u015fmas\u0131yla deadlock olu\u015fur.\n        \n        System.out.println(Thread.currentThread().getName() + \" \" + this.id + \" hesab\u0131ndan \" + target.id + \" hesab\u0131na \" + amount + \" transfer etmeye \u00e7al\u0131\u015f\u0131yor.\");\n        \n        \/\/ \u00d6nce kendi hesab\u0131n\u0131n kilidini al\n        synchronized (this) {\n            System.out.println(Thread.currentThread().getName() + \": Account \" + this.id + \" kilitlendi.\");\n            try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } \/\/ Deadlock \u015fans\u0131n\u0131 art\u0131rmak i\u00e7in beklet\n\n            \/\/ Sonra hedef hesab\u0131n kilidini al\n            synchronized (target) {\n                System.out.println(Thread.currentThread().getName() + \": Account \" + target.id + \" kilitlendi.\");\n                if (this.balance >= amount) {\n                    this.withdraw(amount);\n                    target.deposit(amount);\n                    System.out.println(Thread.currentThread().getName() + \": Transfer ba\u015far\u0131l\u0131. \" + this.id + \" -> \" + target.id);\n                } else {\n                    System.out.println(Thread.currentThread().getName() + \": Yetersiz bakiye. Transfer iptal edildi.\");\n                }\n            }\n        }\n    }\n}\n\npublic class DeadlockExample {\n    public static void main(String[] args) throws InterruptedException {\n        Account account1 = new Account(1, 500);\n        Account account2 = new Account(2, 500);\n\n        Runnable transfer1to2 = () -> {\n            account1.transfer(account2, 100);\n        };\n\n        Runnable transfer2to1 = () -> {\n            account2.transfer(account1, 200);\n        };\n\n        Thread t1 = new Thread(transfer1to2, \"Thread-1\");\n        Thread t2 = new Thread(transfer2to1, \"Thread-2\");\n\n        t1.start();\n        t2.start();\n\n        t1.join();\n        t2.join();\n\n        System.out.println(\"Son Bakiye Hesap 1: \" + account1.getBalance());\n        System.out.println(\"Son Bakiye Hesap 2: \" + account2.getBalance());\n    }\n}<\/pre>\n<p><\/code><br \/>\nYukar\u0131daki <code>DeadlockExample<\/code> kodunu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>Thread-1<\/code> <code>account1<\/code>'in kilidini al\u0131p <code>account2<\/code>'nin kilidini beklerken, <code>Thread-2<\/code> <code>account2<\/code>'nin kilidini al\u0131p <code>account1<\/code>'in kilidini bekleyebilir. Bu durumda her iki thread de sonsuza kadar bekler ve program kilitlenir. Konsol \u00e7\u0131kt\u0131s\u0131nda iki thread'in de \"kilitlendi\" mesajlar\u0131n\u0131 g\u00f6rebilir ancak transfer i\u015fleminin tamamlanmad\u0131\u011f\u0131n\u0131 fark edersiniz.<\/p>\n<h4>5.3. Deadlock'tan Ka\u00e7\u0131nma Y\u00f6ntemleri<\/h4>\n<p>Deadlock'tan ka\u00e7\u0131nman\u0131n en yayg\u0131n ve etkili yolu, kaynaklar\u0131 her zaman belirli bir s\u0131rada edinmektir. \u00d6rne\u011fin, banka hesaplar\u0131n\u0131 ID'lerine g\u00f6re s\u0131ralay\u0131p her zaman \u00f6nce daha d\u00fc\u015f\u00fck ID'li hesab\u0131n kilidini, sonra daha y\u00fcksek ID'li hesab\u0131n kilidini almak.<\/p>\n<pre><code class=\"language-java\">\/\/ Deadlock'tan ka\u00e7\u0131nan transfer metodu\npublic void safeTransfer(Account target, double amount) {\n    Account firstLock = this.id < target.id ? this : target;\n    Account secondLock = this.id < target.id ? target : this;\n\n    synchronized (firstLock) {\n        System.out.println(Thread.currentThread().getName() + \": Account \" + firstLock.getId() + \" kilitlendi.\");\n        try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }\n\n        synchronized (secondLock) {\n            System.out.println(Thread.currentThread().getName() + \": Account \" + secondLock.getId() + \" kilitlendi.\");\n            if (this.balance >= amount) {\n                this.withdraw(amount);\n                target.deposit(amount);\n                System.out.println(Thread.currentThread().getName() + \": Transfer ba\u015far\u0131l\u0131. \" + this.id + \" -> \" + target.id);\n            } else {\n                System.out.println(Thread.currentThread().getName() + \": Yetersiz bakiye. Transfer iptal edildi.\");\n            }\n        }\n    }\n}<\/pre>\n<p><\/code><br \/>\nBu <code>safeTransfer<\/code> metodunda, her iki thread de kilitleri ayn\u0131 s\u0131rayla (ID'ye g\u00f6re k\u00fc\u00e7\u00fckten b\u00fcy\u00fc\u011fe) almaya \u00e7al\u0131\u015faca\u011f\u0131ndan deadlock olu\u015fmaz.<\/p>\n<h3>6. Sonu\u00e7 ve En \u0130yi Uygulamalar<\/h3>\n<p>Java multithreading, uygulamalar\u0131n\u0131za b\u00fcy\u00fck performans ve tepkisellik kazand\u0131rabilirken, e\u015fzamanl\u0131l\u0131k sorunlar\u0131 (yar\u0131\u015f durumlar\u0131, deadlock'lar) nedeniyle geli\u015ftirme s\u00fcrecini karma\u015f\u0131kla\u015ft\u0131rabilir. <code>synchronized<\/code> anahtar kelimesi, <code>wait()<\/code>, <code>notify()<\/code> gibi mekanizmalar ve <code>java.util.concurrent<\/code> paketindeki geli\u015fmi\u015f ara\u00e7lar (Executor Framework, Concurrent Collections, Locks), bu sorunlar\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc \u00e7\u00f6z\u00fcmler sunar.<\/p>\n<p><strong>En \u0130yi Uygulamalar:<\/strong><br \/>\n*   <strong>Kilit Kapsam\u0131n\u0131 Dar Tutun:<\/strong> <code>synchronized<\/code> bloklar\u0131n\u0131 m\u00fcmk\u00fcn oldu\u011funca k\u00fc\u00e7\u00fck tutarak kilitli kalma s\u00fcresini azalt\u0131n.<br \/>\n*   <strong>Deadlock'tan Ka\u00e7\u0131n\u0131n:<\/strong> Kaynaklar\u0131 her zaman tutarl\u0131 bir s\u0131rayla edinmeye \u00e7al\u0131\u015f\u0131n.<br \/>\n*   <strong><code>java.util.concurrent<\/code> Paketini Kullan\u0131n:<\/strong> Bu paket, \u00e7o\u011fu e\u015fzamanl\u0131l\u0131k ihtiyac\u0131 i\u00e7in test edilmi\u015f, y\u00fcksek performansl\u0131 ve g\u00fcvenli yap\u0131lar sunar (\u00f6rne\u011fin, <code>ExecutorService<\/code>, <code>ConcurrentHashMap<\/code>, <code>AtomicInteger<\/code>).<br \/>\n*   <strong>Immutable (De\u011fi\u015fmez) Nesneler Kullan\u0131n:<\/strong> M\u00fcmk\u00fcn oldu\u011funca durumu de\u011fi\u015ftirilemez nesnelerle \u00e7al\u0131\u015fmak, e\u015fzamanl\u0131l\u0131k sorunlar\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r.<br \/>\n*   <strong>Thread G\u00fcvenli\u011fini Test Edin:<\/strong> Multithreaded uygulamalar\u0131 kapsaml\u0131 bir \u015fekilde test etmek, gizli e\u015fzamanl\u0131l\u0131k hatalar\u0131n\u0131 ortaya \u00e7\u0131karmak i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h3>7. S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>7.1. Thread ile Process fark\u0131 nedir?<\/h4>\n<p>Bir <strong>Process<\/strong>, i\u015fletim sistemi taraf\u0131ndan ayr\u0131lm\u0131\u015f kendi bellek alan\u0131na, kaynaklar\u0131na ve ba\u011f\u0131ms\u0131z y\u00fcr\u00fctme ortam\u0131na sahip bir program \u00f6rne\u011fidir. <strong>Thread<\/strong> ise bir process i\u00e7indeki hafif bir y\u00fcr\u00fctme birimidir. Ayn\u0131 process i\u00e7indeki thread'ler bellek ve kaynaklar\u0131 payla\u015f\u0131r, bu da aralar\u0131ndaki ileti\u015fimi daha h\u0131zl\u0131 ve kolay hale getirir ancak e\u015fzamanl\u0131l\u0131k sorunlar\u0131na yol a\u00e7abilir.<\/p>\n<h4>7.2. Race Condition nedir?<\/h4>\n<p>Birden fazla thread'in payla\u015f\u0131lan bir kayna\u011fa ayn\u0131 anda eri\u015fip onu de\u011fi\u015ftirmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131 ve i\u015flemlerin beklenen s\u0131rayla veya atomik olarak ger\u00e7ekle\u015fmemesi nedeniyle veri tutars\u0131zl\u0131\u011f\u0131na yol a\u00e7t\u0131\u011f\u0131 durumdur.<\/p>\n<h4>7.3. <code>volatile<\/code> anahtar kelimesi ne i\u015fe yarar?<\/h4>\n<p><code>volatile<\/code> bir de\u011fi\u015fkene uyguland\u0131\u011f\u0131nda, bu de\u011fi\u015fkenin her zaman ana bellekten okunmas\u0131n\u0131 ve ana belle\u011fe yaz\u0131lmas\u0131n\u0131 sa\u011flar. Bu, CPU \u00f6nbelleklerindeki eski de\u011ferlerin kullan\u0131lmas\u0131n\u0131 engeller ve thread'ler aras\u0131nda de\u011fi\u015fkenin en g\u00fcncel de\u011ferinin g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fcn\u00fc garanti eder. Ancak atomiklik sa\u011flamaz; yani <code>volatile<\/code> bir de\u011fi\u015fken \u00fczerinde birden fazla i\u015flem (\u00f6rne\u011fin <code>i++<\/code>) hala yar\u0131\u015f durumlar\u0131na yol a\u00e7abilir.<\/p>\n<h4>7.4. Executor Framework nedir?<\/h4>\n<p><code>java.util.concurrent<\/code> paketinin bir par\u00e7as\u0131 olan Executor Framework, thread y\u00f6netimini basitle\u015ftiren bir yap\u0131d\u0131r. Do\u011frudan <code>Thread<\/code> nesneleri olu\u015fturmak yerine, g\u00f6revleri (task) bir <code>ExecutorService<\/code>'e g\u00f6nderirsiniz. <code>ExecutorService<\/code>, thread havuzlar\u0131n\u0131 y\u00f6neterek thread olu\u015fturma, yeniden kullanma ve sonland\u0131rma gibi maliyetli i\u015flemleri sizin yerinize halleder, b\u00f6ylece kaynak kullan\u0131m\u0131n\u0131 optimize eder.<\/p>\n","protected":false},"excerpt":{"rendered":"Java Multithreading Explained: Thread States, Synchronization &#038; Deadlocks &#8211; Through One Example\nJava multithreading, modern yaz\u0131l\u0131m geli\u015ftirmenin temel t&#8230;","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-38161","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 Multithreading Explained: Thread States, Synchronization &amp; Deadlocks - Through One Example - 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\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java Multithreading Explained: Thread States, Synchronization &amp; Deadlocks - Through One Example\" \/>\n<meta property=\"og:description\" content=\"Java Multithreading Explained: Thread States, Synchronization &amp; Deadlocks - Through One Example Java multithreading, modern yaz\u0131l\u0131m geli\u015ftirmenin temel t...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-24T15:00:39+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=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java Multithreading Explained: Thread States, Synchronization &#038; Deadlocks &#8211; Through One Example\",\"datePublished\":\"2026-01-24T15:00:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/\"},\"wordCount\":1838,\"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\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/\",\"name\":\"Java Multithreading Explained: Thread States, Synchronization & Deadlocks - Through One Example - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-24T15:00:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java Multithreading Explained: Thread States, Synchronization &#038; Deadlocks &#8211; Through One Example\"}]},{\"@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 Multithreading Explained: Thread States, Synchronization & Deadlocks - Through One Example - 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\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/","og_locale":"tr_TR","og_type":"article","og_title":"Java Multithreading Explained: Thread States, Synchronization & Deadlocks - Through One Example","og_description":"Java Multithreading Explained: Thread States, Synchronization & Deadlocks - Through One Example Java multithreading, modern yaz\u0131l\u0131m geli\u015ftirmenin temel t...","og_url":"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-24T15:00:39+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java Multithreading Explained: Thread States, Synchronization &#038; Deadlocks &#8211; Through One Example","datePublished":"2026-01-24T15:00:39+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/"},"wordCount":1838,"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\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/","url":"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/","name":"Java Multithreading Explained: Thread States, Synchronization & Deadlocks - Through One Example - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-24T15:00:39+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/java-multithreading-explained-thread-states-synchronization-deadlocks-through-one-example\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java Multithreading Explained: Thread States, Synchronization &#038; Deadlocks &#8211; Through One Example"}]},{"@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\/38161","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=38161"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38161\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38161"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}