DeadLock, tryLock

Kategori: Java , 21 Temmuz 2019 , JanFranco


İki fonksiyon düşünelim. Birinci fonksiyonun ilk iki satırı Lock1.lock();, Lock2.lock(); olsun. İkinci fonksiyonun ilk iki satırı da Lock2.lock();, Lock1.lock(); olsun. Bu iki fonksiyon eş zamanlı çalıştığı zaman birinci fonksiyon Lock1'e ikinci fonksiyon Lock2'ye sahip olacak. Bir sonraki adımda ise birinci fonksiyon Lock2'ye sahip olmaya, ikinci fonksiyon da Lock1'e sahip olmaya çalışacak. İşte burada sonsuz bir beklemeye girilecek çünkü iki Lock'un da sahipleri var. Birbirlerinden habersiz bir şekilde birbirlerini bekliyorlar. İşte bu tarz sonsuz döngülere girdiğimiz durumlar DeadLock olarak adlandırılmakta. Yukarıda anlattığım durumu tryLock methodu ile çözebiliriz. Görelim:


import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class DeadLockExample {
	
	Hesap hesap1 = new Hesap();
	Hesap hesap2 = new Hesap();
	private Lock lock1 = new ReentrantLock();
	private Lock lock2 = new ReentrantLock();
	Random random = new Random();

	public void LocklariKontrolEt(Lock a, Lock b){
		
		boolean a_elde_edildi = false;
		boolean b_elde_edildi = false;
		
		while(true){
			
			a_elde_edildi = a.tryLock();
			b_elde_edildi = b.tryLock();
			
			if(a_elde_edildi == true && b_elde_edildi == true){
				
				return;
				
			}
			if(a_elde_edildi == true){
				
				a.unlock();
				
			}
			if(b_elde_edildi == true){
				
				b.unlock();
				
			}
			
		}
		
	}
	
	public void thread1Fonksiyon(){
		
		LocklariKontrolEt(lock1, lock2);
		
		for(int i=0; i<5000; i++){
			
			Hesap.paraTransferi(hesap1, hesap2, random.nextInt(100));
			
		}
		
		lock1.unlock();
		lock2.unlock();
		
	}
	
	public void thread2Fonksiyon(){
		
		LocklariKontrolEt(lock2, lock1);
	
		for(int i=0; i<5000; i++){
			
			Hesap.paraTransferi(hesap2, hesap1, random.nextInt(100));
			
		}
		
		lock1.unlock();
		lock2.unlock();
		
	}
	
	public void threadOver(){
		
		System.out.println("Hesap1 bakiye: " + hesap1.getBakiye() + " Hesap2 bakiye: " + hesap2.getBakiye());
		
		System.out.println("Toplam bakiye: " + (hesap1.getBakiye()+hesap2.getBakiye()));
	}
	
}
tryLock methodu bir Lock'u dener ve o Lock'u elde ederse true olarak değer döndürür. Burada LocklariKontrolEt isminde bir fonksiyon yazdık. Eğer iki Lock'da boşta ise while döngüsü sonlanacaktır. Burada bir sıkıntı yoktur. Eğer iki Lock aynı anda boş değil ise bir dolu olan lock, unlock edilecek. Böylelikle çıkmaza giren fonksiyonlar çözülmüş olacak. Bu örnek DeadLock'u anlatmak içindir. Hesap ve Main_class sınıflarını kendiniz yazıp deneyebilirsiniz.


Sonraki Yazı: Callable, Future, Return from Threads
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın