/* erzeugt ein Deadlock durch wechselseitigen Zugriff auf zwei Ressourcen r1, r2
 * durch zwei Threads: DThread1 und DThread2
 * wenn das Programm stehenbleibt kann man durch Drücken von Strg+Backslash
 * Informationen zum Deadlock (und den Threads) anzeigen
 */

class Deadlock{

	//zwei Ressourcen die von den zwei Threads gesperrt werden
	Object r1 = new Object();
	Object r2 = new Object(); 

	class  DThread1 extends Thread{

		public void run(){
 		   
		   //Endlosschleife
		   while(true){	
			System.out.print("T1 warte auf r1...");
			//erst versuchen r1 zu sperren
			synchronized(r1){
				System.out.println("T1..habe r1 und warte auf r2");
				//dann r2
				synchronized(r2){
				}
			}
		}}
	}//D1


	//macht das gleiche, wie DThread1 nur umgekehrte synchronized
	//Reihenfolge (erst r2, dann r1)
	class DThread2 extends Thread{

		public void run(){
    		   
		   while(true){	
			System.out.println("T2 warte auf r2...");
			synchronized(r2){
				
				System.out.println("T2..habe r2 und warte auf r1");
				synchronized(r1){
				}
			}
		}}
	}//D2
	
	//erzeugt und startet die zwei Threads
	public void startThreads(){
		DThread1 d1 = new DThread1();
		DThread2 d2 = new DThread2();
		
		d1.start();
		d2.start();
	}
	
	public static void main(String[] args){
		Deadlock d = new Deadlock();
		d.startThreads();
		
	}
	
	
}

