Pure Java – 91 Thread – 08 – Deadlock

Merhaba Arkadaslar,
Bu yazia Deadlock konusunu inceleyecegiz. Multithread uygulamada threadlerin zamaninda calismasina Liveness denilir. Bu calismaya engel olan bazi problemler vardir; bunlardan birtanesi Deadlock’lardir

Deadlock ; 2 veya daha fazla thread’in birbirlerini blocklama durumudur. Her objenin built-in bir kilidi(lock) vardir.

Thread’ler , birbirlerinin elinde bulunan obje kilidini bekledigi durumda bu blocklama durumu soz konusu olacaktir.

Thread 1 synchronized bir methoda girer ve A kilidini ele gecirir. Daha sonrasinda yeni bir synchronized metoda girmeye calisir fakat bu metoda girmek icin gerekli olan obje kilidi Thread 2 nin elindedir(B kilidi). Bu durumda Thread 1 , Thread 2 nin isini bitirmesini ve obje kilidini birakmasini bekler(B kilidi).

Bu sirada Thread 2 , synchronized bir metoda girer ve B kilidini ele gecirir. Bu metod icerisinde synchronized bir method yer almaktadir ve A kilidi gerekmektedir, fakat A kilidi Thread 1’in elinde bulunmaktadir. Bu durumda Thread 2 , Thread 1 ‘in isini bitirmesini ve obje kilidini birakmasini bekler(A kilidi).

Thread 1 , B kilidini beklemektedir.Thread 2 ise A kilidini beklemektedir. Threadlerin birbirlerinin kilitlerine ihtiyac duydugu ve birakmasini/release bekledigi bu durumda deadlock durumu ortaya cikacaktir.

public class TestThread {
	public static Object LockA = new Object();
	public static Object LockB = new Object();

	public static void main(String args[]) {

		ThreadDemo1 thread1 = new ThreadDemo1();
		ThreadDemo2 thread2 = new ThreadDemo2();
		thread1.start();
		thread2.start();
	}

	private static class ThreadDemo1 extends Thread {
		public void run() {
			synchronized (LockA) {
				System.out.println("Thread 1: Holding lock A...");
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
				}
				System.out.println("Thread 1: Waiting for lock B...");
				synchronized (LockB) {
					System.out.println("Thread 1: Holding LockA & LockB...");
				}
			}
		}
	}

	private static class ThreadDemo2 extends Thread {
		public void run() {
			synchronized (LockB) {
				System.out.println("Thread 2: Holding LockB...");
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
				}
				System.out.println("Thread 2: Waiting for LockA...");
				synchronized (LockA) {
					System.out.println("Thread 2: Holding LockA & LockB...");
				}
			}
		}
	}
}

Bu problemi cozmek icin kilitlerin yerini degistirebiliriz ya da bu tarz bir lock mekanizmasi yerine java.util.concurrent.locks paketinde yer alan Lock arabirimi kullanilarak timeout suresi verilebilir. Bu konu sinav kapsaminda yer almamaktadir. Bu yazilar bittiginde ilerleyen donemlerde Thread konusunu guncelledigimde bu konu eklenecektir.

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *